redis学习计划(十二)事务(transaction)

redis学习计划(十二)事务(transaction)

  redis提供了事务,事务就是一个操作集合,保证集合内的操作都是序列化,并且具有原子性的。在执行的过程中,不会受到其他命令的影响。

事务中的命令,只有全部执行,或者全部都不执行。但是redis的实现方式还是有些许不同的。redis的事务是,如果命令集合里面,有某条命令出现了问题,只有出现问题的命令不会执行,无错误的命令则会继续执行。而且redis的事务并不支持回滚,redis对此的解释是:redis命令执行错误,只会因为语法错误而产生,而语法的错误是应该在开发过程中发现的,而不是在生产过程中发现。所以个人理解的redis事务,则是一组有效的命令集合。

  redis的事务使用流程是:multi开启事务-> enter commends->add commends to queued->exec。就是开启事务,输入命令,将命令

加入执行队列,调用exec进行执行。如此的话产生错误的时候可能有两种情况。1.输入有误的命令,在加入队列的时候就被发现,

那么后记所有的命令都不会执行。2.输入有误的命令,在加入队列的时候未被发现,在执行的时候才被发现。则此命令执行失败,其他命令继续执行。

  此处大约有效命令为:

  • WATCH:开启监视。
  • UNWATCH:取消监视。
  • MULTI:开启事务。
  • DISCARD:取消事务,放弃执行事务块内的所有命令。
  • EXEC:执行事务内命令,假如某个key处于被监视状态。那么只有在此key的值符合条件时才执行,不然事务被中断。该命令返回事务内所有结果集。

使用方法详解:

  1.开启事务,正常执行命令。


  

  2.WATCH配合事务。ex

  

  3.加入队列的时候命令检验出错,整体不执行。

  

  4.加入队列的时候命令检验无错误,执行的时候出错,部分执行。

 

上述就是redis的transcation简单应用。

 

在python中,使用事务:

语法全部正常时:

rs=redis.Redis(host='127.0.0.1', port=6379, db=0)
def exec1(self):
    rs.set('bb', 1)
    rs.incr('bb')
    rs.incr('bb')
rs.transaction(exec1)
rs.get('bb')  #事务执行成功
# out: 3

 

 语法有错误时,错误的命令不执行,不影响其它正确的命令的执行:
def exec1(self):
    rs.set('b1', 1)
    rs.incr('b1')
    rs.incr('b1')
    rs.set('abc', 1,2,3)  # 错误的语法
    rs.incr('b1')    
rs.transaction(exec1)
rs.get('b1')   # 正确的语法部分,执行成功
# 4
rs.get('abc')  # 错误的语法部分,跳过
# None

 

 
 
 
 
 

posted on 2018-09-06 14:27  myworldworld  阅读(91)  评论(0)    收藏  举报

导航