Redis的事务控制命令、常见执行情况及watch机制

概念:

事务是指一系列操作步骤中 这一系列的操作步骤要么完全执行 要么完全不执行
例如:微博的A用户关注了B用户 那么A的关注人列表中就会出现B用户 B用户的粉丝列表中就会有A用户

这个关注和被关注的过程是由一系列的操作步骤组成的:
1、A用户添加到B用户的粉丝列表中
2、B用户添加到A用户多关注列表中
这两个步骤必须全部执行成功 整个逻辑才是正确的 否则会产生数据的错误 例如:A用户的关注列表中有B用户 但B用户的粉丝列表中没有A用户

为了确保一系列的操作完全成功 提出了事务控制的概念

Redis的事务(transaction)是一组命令的集合 且至少是两个或两个以上的命令
Redis的事务确保了这些命令在被执行的时候不会被任何其它操作打断
单个 Redis 命令的执行是原子性的 但 Redis 没有在事务上增加任何维持原子性的机制 因此Redis事务的执行并不是原子性的

事务可以理解为一个打包的批量执行脚本 但批量指令并非原子化的操作 中间某条指令的失败不会导致前面已做指令的回滚 也不会造成后续的指令的停止

二、命令

标记一个事务块的开始 ------> 即 开启事务(beginTransaction)
事务内的多条命令会按照先后顺序被放入一个队列中
返回值:OK

multi

执行所有事务块内的命令 ------> 即 提交(commit)
返回值:事务内的所有执行语句的内容
事务被打断则返回null

exec

取消事务 ------> 即 回滚(rollback)
放弃执行事务块内的所有命令
返回值:OK

discard

监视一个或多个key
若在事务执行之前这个或这些key被其他命令所改动 那么事务将被打断
返回值:OK

watch key [key ...] 

取消watch命令对所有key的监视
若watch之后exec命令或discard命令被执行了 则无须再执行unwatch命令了
因为此时事务内的命令已被执行了 unwatch没有意义了
返回值:OK

unwatch

三、执行情况

情况1、正常执行步骤

首先开启事务 然后向事务队列中加入命令 最后执行事务提交

  • 1)multi: 用 multi 命令告诉Redis接下来要执行的命令先不要执行 而是暂时存起来(开启事务)
  • 2)sadd classmate Piconjo:第一条命令进入等待队列(命令入队)
  • 3)sadd classmate Tankman:第二条命令进入等待队列(命令入队)
  • 4)exce:告知redis执行前面储存的命令

在这里插入图片描述

情况2、事务执行exec之前 入队命令错误 放弃事务

  • 1)multi:正常命令
  • 2)set:正常命令
  • 3)incr:命令语法错误
  • 4)exec:无法执行事务 第一条正确的命令也不会执行

在这里插入图片描述

情况3、事务执行exec命令后 执行队列中的命令时发生命令执行错误 事务提交

  • 1)multi:正常命令
  • 2)set:正常命令
  • 3)lpop classmate:语法没有错误 执行时才会有错误
  • 4)exec:正常执行 发现错误则不执行该事务 其余事务还是会执行

在这里插入图片描述
在exec执行后的所产生的错误 即使事务中有某个或某些命令在执行时产生了错误
事务中的其他命令仍然会继续执行
Redis在事务失败时不进行回滚 而是继续执行余下的命令

Redis命令只会因错误的语法而失败(这些问题不能在入队时发现) 或是命令用在了错误类型的键上面
由于失败的命令并不是Redis导致 而是由编程错误造成的 况且这样的错误应该在开发的过程中被发现
生产环境中不应出现语法的错误 就是在程序的运行环境中也不应该出现语法的错误
Redis能够保证正确的命令一定会被执行
不需要对回滚进行支持 也是为了保证Redis的内部保持简单且快速

4、放弃事务 事务不执行

  • 1)multi:正常命令
  • 2)sadd classmate Piconjo:第一条命令进入等待队列(命令入队)
  • 3)sadd classmate Tankman:第二条命令进入等待队列(命令入队)
  • 4)discard:放弃事务 则命令队列不会被执行

在这里插入图片描述


四、Watch机制

原理:

使用watch监视一个或多个key 跟踪key的value修改情况 若如果有key的value值在事务exec执行之前被修改了 则当前整个事务被取消
exec会返回提示信息 表示事务已失败

Watch机制使得事务exec变得有条件 事务只有在被Watch的key没有修改的前提下才可执行
若不满足条件 事务就取消
若使用Watch监视了一个带过期时间的键 那么即使这个键过期了 事务仍然可以正常执行

测试:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

取消Watch对key的监视

  • 1、当调用exec为止 不管事务是否成功执行 对所有键的监视都会被取消
  • 2、当客户端断开连接时 该客户端对键的监视也会被取消
  • 3、使用unwatch命令手动取消对所有键的监视

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值