Redis的事务和Watch机制

1、背景

Redis version: 3.2.9

2、事务

Redis的事务,可以理解成是一系列命令的打包操作。
与传统事务相比,Redis的事务不支持回滚,若遇到错误,不影响其他命令的执行。符合Redis追求快速、高效的目标。当然,与此同时,也就无法做到严格的要么全部执行,要么全不执行。

(1)常用命令

multi exec discard 等

multi:开启事务
exec:提交事务
discard:取消事务

Tips:
因“语法错误”导致的error,redis 事务不回滚,不影响其他命令执行

下面的例子所示:
其中k1为string,无法执行incr命令,因此会报error。报错后,并没有影响后面的k2、k3的操作。
请添加图片描述

(2)lua脚本

是Redis事务的另一种实现,通过lua脚本,可以执行事务的原子性。

3、Watch

常用命令:Watch、UnWatch等

监控key,在事务中,若key被其他进程修改,则不允许被提交。
在这里插入图片描述
示例:
client1:
在这里插入图片描述
client2:
在这里插入图片描述
client1:
在这里插入图片描述
在client1的修改k的命令提交时,监测到k值已经被修改,因此,在执行“exec”提交事务命令时失败。client1的修改操作无法执行。

对于并发问题,Redis采用乐观锁的CAS去处理同步问题。另外,Redis中的CAS不会出现ABA问题。

Why?
我们从监控的示意图说起,若client监控了某个key值,就会将client信息保存在其后的链表中。
在这里插入图片描述
Redis在对key1值执行操作命令(如 set、del、sadd等)后,会将所有监视这个key1的客户端的REDIS_DIRTY_CAS选项打开。当客户端执行exec等命令时,会去检查REDIS_DIRTY_CAS。若被打开,则说明有其他client已经对该key值进行了修改,事务提交失败。

综上所述,CAS的ABA问题不会在Redis的watch中出现。

3、小结

无论是Redis的事务还是乐观锁的Watch机制,在了解新东西“如何用”的同时,也要和以往的基础做关联做对比,找到相似之处和不同之处。并分析不同之处存在的缘由。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值