zoukankan      html  css  js  c++  java
  • Redis事务

    一、Redis事务概述

      Redis事务是一个单独的隔离操作,事务中所有的命令都会序列化、按顺序执行,事务在执行的过程中不会被其它客户端发送过来的命令所打断.

      Redis同一事务中如果有一条命令执行失败,其它的命令仍然会被执行,没有回滚.

      Redis事务的主要作用是串联多个命令,防止别的命令插队.  

    二、Redis事务的几个阶段

      1、开始事务

      2、事务入队

      3、执行事务

    三、Redis事务相关命令

      watch key1 key2:监视一个或多个key,如果监视的key被其它命令所修改,则事务被打断(类似于悲观锁中比较版本号,而Redis是比较key是否被修改过)

      multi:标记Redis事务的开始

      discard:放弃事务

      exec:执行事务

      unwatch:取消watch对所有key的监视

    一、Redis正常开启事务,执行事务.
    127.0.0.1:6379> multi 
    OK
    127.0.0.1:6379> hincrby role role:9527:age 2
    QUEUED
    127.0.0.1:6379> hincrby role role:9527:age 3
    QUEUED
    127.0.0.1:6379> hincrby role role:9527:age -5
    QUEUED
    127.0.0.1:6379> exec
    1) (integer) 24
    2) (integer) 27
    3) (integer) 22
    
    二、Redis放弃事务.
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> hmset role role:9527:birthday 1992-10-10 
    QUEUED
    127.0.0.1:6379> hexists role role:9527:id
    QUEUED
    127.0.0.1:6379> hkeys role
    QUEUED
    127.0.0.1:6379> discard
    OK
    
    三、Redis在事务队列中存在语法性错误(类似于java中的运行时异常),则执行exec命令时,正确的命令会被执行,错误的命令会抛出异常.
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> hkeys role
    QUEUED
    127.0.0.1:6379> hvals role
    QUEUED
    127.0.0.1:6379> hincrby role role:9527:name 3
    QUEUED
    127.0.0.1:6379> exec
    1) 1) "role:9527:id"
       2) "role:9527:name"
       3) "role:9527:age"
    2) 1) "9527"
       2) "xiaomaomao"
       3) "22"
    3) (error) ERR hash value is not an integer
    
    四、Redis在事务队列中出现命令性异常(类似于java中的编译期异常),则执行exec命令的时候所有命令都不会执行.
    127.0.0.1:6379> multi 
    OK
    127.0.0.1:6379> hexists role role:9527:name
    QUEUED
    127.0.0.1:6379> hget role
    (error) ERR wrong number of arguments for 'hget' command
    127.0.0.1:6379> hsetnx role role:9527:gender female
    QUEUED
    127.0.0.1:6379> exec
    (error) EXECABORT Transaction discarded because of previous errors.
    

     

    watch:

      情况一:左边客户端设置balance=100、debt=0---->左边客户端和右边客户端同时查询,结果都是balance=100,debt=0---->左边客户端watch balance debt---->

    ---->muti开启事务---->设置balance=80、debt=20---->exec执行事务---->左右客户端同时查询balance、debt,显示结果为80和20.

      

      情况二:左边客户端设置balance=100、debt=0---->左右客户端同时查询balance、debt显示结果为balance=100、debt=0---->左边客户端监视balance、debt---->使用muti命令开启事务---->事务入队set balance 80、set debt 20---->右边客户端设置balance 200---->左边客户端使用命令exec执行事务---->显示事务执行失败---->左右客户端同时查询balance、debt---->显示的结果为balance=200、debt=0

     

      注:一旦使用exec命令执行事务后,无论事务是否执行成功,watch对key的监控都会被移除,所以当事务执行失败后如果还想对key进行监控,就必须再一次使用watch key1 key2...命令对指定的key监控,并开启新的事务操作.

      

  • 相关阅读:
    bzoj 2442: [Usaco2011 Open]修剪草坪【单调栈】
    bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级【分层图+spfa】
    bzoj 1646: [Usaco2007 Open]Catch That Cow 抓住那只牛【bfs】
    bzoj 1677: [Usaco2005 Jan]Sumsets 求和【dp】
    bzoj 1657: [Usaco2006 Mar]Mooo 奶牛的歌声【单调栈】
    洛谷 P4180 【模板】严格次小生成树[BJWC2010]【次小生成树】
    bzoj 1660: [Usaco2006 Nov]Bad Hair Day 乱发节【单调栈】
    bzoj 1726: [Usaco2006 Nov]Roadblocks第二短路【dijskstra】
    bzoj 1631: [Usaco2007 Feb]Cow Party【spfa】
    bzoj 1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛【dp+树状数组+hash】
  • 原文地址:https://www.cnblogs.com/xiaomaomao/p/13393411.html
Copyright © 2011-2022 走看看