Redis事务锁CAS实现以及深入误区

Redis中的事务

Redis的事务没有mysql那么的丰富,但在JAVA web的开发过程中利用mysql事务锁并不能满足应用场景,或者说并不是很简便,例如发放新人大礼包,代金券这种电商场景。

谈到事务,就跟acid分离不开,Redis事务也较好地满足了一致性和隔离性,但持久性和原子性一直有争议,业务上一般使用redis的组合原子操作来完成事务的原子性,redis事务的几个关键命令:

MULTI: 开启一个事务,类比于mysql的openSession
EXEC: 提交一个事务,类比于mysql的commit
DISCARD: 取消一个事务,类比于mysql的rollback
WATCH:监控一个key,与redis事务机制结合使用,形成原子锁

Redis实现CAS(Check-And-Set)的测试场景

  • 场景一:
10.185.0.120:6932> watch test
OK
// 另一个clinet 对test执行incr操作后
//在当前clinet继续操作
10.185.0.120:6932> multi
OK
10.185.0.120:6932> exec
(nil)
  • 场景二:
10.185.0.120:6932> watch test
OK
// 另一个clinet 执行下面操作
10.185.0.120:6932> multi
OK
10.185.0.120:6932> incr test
QUEUED
10.185.0.120:6932> exec
(nil)
  • 场景三:
10.185.0.120:6932> get test
"88"
10.185.0.120:6932> watch test
OK
10.185.0.120:6932> incr test
(integer) 89
10.185.0.120:6932> multi
OK
10.185.0.120:6932> incr test
QUEUED
10.185.0.120:6932> exec
(nil)
  • 场景四:
10.185.0.120:6932> get test
"89"
10.185.0.120:6932> wacth test
OK
10.185.0.120:6932> multi
OK
10.185.0.120:6932> incr test
QUEUED
10.185.0.120:6932> exec
1) (integer) 90

对上面五种场景总结:

1. client A watch,clientB set/incr等等操作,clientA 中multi-exec会失败
2. client A watch,clientB multi-set/incr-exec 也会失败
3. client A 中watch后,进行incr/set操作后,再进行multi-incr-exec 也会失败
4. client A watch-multi-incr/set-exec 成功

CAS中的误区理解

这里需要说明的是,Redis官方文档给出的watch命令的解释:

we are asking Redis to perform the transaction only if no other client modified any of the WATCHed keys

从场景三可以看出,这里的“other client” 并不一定是另外一个客户端,watch操作执行之后,multi之外任何操作都可以认为是other clinet在操作(即使仍然是在同一个客户端上操作),exec该事务也仍旧会失败

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍。之后概...
    kelgon阅读 61,386评论 23 625
  • redis事务 Redis 通过 MULTI 、 DISCARD 、 EXEC 和 WATCH 四个命令来实现事务...
    全能程序猿阅读 6,464评论 0 11
  • Redis 通过 MULTI 、 DISCARD 、 EXEC 和 WATCH 四个命令来实现事务功能, 本章首先...
    binge1024阅读 3,424评论 0 2
  • 分布式缓存技术PK:选择Redis还是Memcached? 经平台同意授权转载 作者:田京昆(腾讯后台研发工程师)...
    meng_philip123阅读 69,003评论 7 60
  • 面具下的容颜 双重性格的你 在夜里邪气的你 在阳光下迷茫的你 在夜里受伤的你 我都很喜欢 喜欢就评论吧! ...
    笔奇阅读 4,200评论 4 1