redis实现乐观锁
悲观锁:很悲观,认为什么时候都会出问题,无论做什么都会加锁
乐观锁:很乐观,认为什么时候都不会出问题,所以不会上锁,更新数据的时候会判断是否有人修改过数据,如果没有就提交数据,反之,不提交
redis通过watch实现监控,相当于一把锁,可以实现乐观锁操作
127.0.0.1:6379> set money 100 # money=100
OK
127.0.0.1:6379> set out 0 # out=0:消费0元
OK
127.0.0.1:6379> watch money # 监控money
OK
127.0.0.1:6379> multi # 开启事务
OK
127.0.0.1:6379(TX)> DECRBY money 20 # money减少20,money=80
QUEUED
127.0.0.1:6379(TX)> INCRBY out 20 # 消费20,out=20
QUEUED
127.0.0.1:6379(TX)> exec # 执行事务,没有异常
1) (integer) 80
2) (integer) 20
127.0.0.1:6379>
接着上面的money继续操作
127.0.0.1:6379> watch money # 监控money
OK
127.0.0.1:6379> multi # 开启事务
OK
127.0.0.1:6379(TX)> DECRBY money 10 # money减少10,money=70
QUEUED
127.0.0.1:6379(TX)> INCRBY out 10 # 消费10,out=30
QUEUED
127.0.0.1:6379(TX)> exec # 在执行事务之前,新开一个窗口,更改money(如下),结果执行事务失败
(nil)
127.0.0.1:6379>
执行上面事务之前,新开一个窗口,更改money
127.0.0.1:6379> get money
"80"
127.0.0.1:6379> set money 1000
OK
如果事务执行失败,就先解除监控:unwatch,获取最新值后,再次监控。