Redis实现乐观锁

Redis实现乐观锁

面试常问

watch 监控 一次命令对事务仅生效一次 ,执行的时候会比较监视时候的值和执行的值是否相等,不相等则报错

# 正常执行一次
127.0.0.1:6379[3]> flushdb
OK
127.0.0.1:6379[3]> set money 100 
OK
127.0.0.1:6379[3]> watch money
OK
127.0.0.1:6379[3]> multi
OK
127.0.0.1:6379[3]> decrby money 20
QUEUED
127.0.0.1:6379[3]> exec
1) (integer) 80

# 开启事务未执行时在另一个客户端set money 800
127.0.0.1:6379[3]> multi
OK
127.0.0.1:6379[3]> decrby money 10
QUEUED
127.0.0.1:6379[3]> exec
1) (integer) 790 # 执行成功,可以看到watch监控已经失效

# 重新添加watch监控,并在开启事务未执行时在另一个客户端set money 800,后面执行事务会报错,相当于乐观锁
127.0.0.1:6379[3]> watch money
OK
127.0.0.1:6379[3]> multi
OK
127.0.0.1:6379[3]> decrby money 10
QUEUED
127.0.0.1:6379[3]> exec
(nil)

放弃监视 unwatch

如果修改失败,放弃监视,获取最新值监视就可以

posted @ 2022-02-26 16:32  Oh,mydream!  阅读(98)  评论(0编辑  收藏  举报