码迷,mamicode.com
首页 > 其他好文 > 详细

Redis 实现乐观锁(watch)

时间:2021-02-16 12:29:04      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:客户端   第一个   exec   nbsp   利用   image   code   修改   strong   

1.悲观锁

很悲观,什么时候都会出问题,无论做什么都加锁,影响效率。

2.乐观锁

  • 很乐观,任务什么时候都不会出问题,所以不会上锁,跟新数据的时候去判断一些,在此期间是否有人修改过这个数据,在Mysql中是利用Version字段实现!在Redis中利用watch命令。
  • 获取version
  • 更新的时候比较version

3.Redis监测(获取乐观锁并执行)

①正常情况执行成功(单线程):

127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> set out 0
OK
127.0.0.1:6379> watch money # 监视 money 对象
OK
127.0.0.1:6379> multi #事务正常结束,数据期间没有发生变动,这个时候就正常执行成功!
OK
127.0.0.1:6379> decrby money 20
QUEUED
127.0.0.1:6379> incrby out 20
QUEUED
127.0.0.1:6379> exec
1) (integer) 80
2) (integer) 10
127.0.0.1:6379>   

②多线程执行事务

开启两个Redis客户端

第一客户端命令入队后并不执行

127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> set out 0
OK
127.0.0.1:6379> watch money #监视 money对象

OK
127.0.0.1:6379> multi 
OK

127.0.0.1:6379> decrby money 10
QUEUED

127.0.0.1:6379> incrby out 10
QUEUED

127.0.0.1:6379>

技术图片

 

 

第二个客户端突然插队执行

127.0.0.1:6379> get money
"100"
127.0.0.1:6379> set money 1000
OK
127.0.0.1:6379>

技术图片

 

 

第一个客户端在执行事务,会执行失败!

127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> set out 0
OK
127.0.0.1:6379> watch money #监视 money对象
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby money 10
QUEUED
127.0.0.1:6379> incrby out 10
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> 

技术图片

 

 使用watch可以当作Redis的乐观锁操作!可以理解mysql中的 get version。在执行之前,先获取是否已经被修改了,如果被修改则执行失败!!

4.执行失败的处理

①放弃乐观锁(unwatch)

②重新执行(重新监视,获取最新的锁)

127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> set out 0
OK
127.0.0.1:6379> watch money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby money 10
QUEUED
127.0.0.1:6379> incrby out 10
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> unwatch
OK
127.0.0.1:6379> watch money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby money 1
QUEUED
127.0.0.1:6379> incrby out 1
QUEUED
127.0.0.1:6379> exec
1) (integer) 999
2) (integer) 1
127.0.0.1:6379>    

技术图片

 

Redis 实现乐观锁(watch)

标签:客户端   第一个   exec   nbsp   利用   image   code   修改   strong   

原文地址:https://www.cnblogs.com/ckfuture/p/14399781.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!