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
如果修改失败,放弃监视,获取最新值监视就可以