代码改变世界

Redis事务

2018-11-05 13:27  李明成  阅读(704)  评论(0编辑  收藏  举报

Redis事务和实现

Redis事务可以让一个客户端在不被其他客户端打断的情况下执行多个命令。通过使用Multi标记一个事务块的开始,把事务块内的多条命令,按照先后顺序放进一个队列当中,最后执行Exec命令原子性执行。

与事务相关的几个命令

 

Redis 乐观锁

CAS主要解决原子性操作的问题。比如用户操作一个key对应的value,需要保证在操作当中,value不允许被其他访问操作,如果被操作过,则操作失败。使用CAS实现乐观锁。

 Redis乐观锁介绍:

watch指令在redis事物中提供了CAS的行为。为了检测被watchkeys在是否有多个clients同时改变引起冲突,这些keys将会被监控。如果至少有一个被监控的key在执行exec命令前被修改,整个事物将会回滚,不执行任何动作,从而保证原子性操作,并且执行exec会得到null的回复。

乐观锁工作机制:

watch 命令会监视给定的每一个key,当exec时如果监视的任一个key自从调用watch后发生过变化,则整个事务会回滚,不执行任何动作。注意watchkey是对整个连接有效的,事务也一样。如果连接断开,监视和事务都会被自动清除。当然execdiscardunwatch命令,及客户端连接关闭都会清除连接中的所有监视。还有,如果watch一个不稳定(有生命周期)key并且此key自然过期,exec仍然会执行事务队列的指令。 

例如:

第一步:第一个客户端监控key leguan ’并且开启一个事务

 

 第二步:开启另外一个客户端 修改key leguan’(redis会通知执行watch命令的客户端)

 

 第三步:设置key leguan 值 并且执行,结果失败(redis执行exec命令时,发现key leguan 已经被修改)

参考:

https://www.cnblogs.com/martinzhang/p/3415204.html

http://doc.redisfans.com/