Redis高级 之 事务

Redis高级 之 事务

Redis事务的本质是一组命令的集合。

Redis的事务分为以下三个阶段:

  • 开启:以MULTI开始一个事务
  • 入队:将多个命令入队到事务中,这些命令并不会立即执行,而是放到等待执行的事务队列里面,最后一起执行
  • 执行:由EXEC命令触发事务

Redis事务相关命令:

  • multi:标记一个事务块的开始。
  • exec:开始执行事务块内的所有命令。
  • discard:取消事务,放弃执行事务块内的所有命令。
  • watch key [key …]:监视一个(多个) key ,如果在事务执行之前这些key中的任意一个被其他命令所改变,那么事务将被打断,这种情况通常可以在程序中重新尝试一次。
  • unwatch:取消 watch 命令对所有 key 的监视。

示例1:

  1. multi:标记一个事务块的开始
    Redis高级 之 事务
  2. discard:取消事务,放弃执行事务块内的所有命令
    Redis高级 之 事务
  3. exec:执行事务块内的所有命令
    3.1 全体连坐(语法有问题,编译时就出错)
    Redis高级 之 事务
    3.2 冤头债主(语法没有问题,运行时才出错)
    Redis高级 之 事务

示例2:模拟信用卡可用余额及支出。用balance表示余额,用debt表示支出,两者数据应该一致:

第一步:打开客户端A,在其中初始化余额和支出,在事务中间完成一次25元的消费,采用先监控再开启的方式,同时保证两笔金额变动在同一个事务内,如下图所示:
Redis高级 之 事务
第二步:在客户端A中,再次监视余额balance,如下图所示:
Redis高级 之 事务
第三步:再打开一个客户端B,在其中给余额增加500元,如下图所示:
Redis高级 之 事务
第三步:在客户端A中再做一次25元的消费,如下图所示:
Redis高级 之 事务
上面代码说明,监控了key的情况下,如果key在别的进程中被被修改了,后面一个事务的执行失效。

第三步若采用unwatch,则会正确远行,如下图所示:
Redis高级 之 事务