Redis-实现乐观锁

浅实现一下乐观锁

这里需要使用watch,直接上案例吧

需求:现有存款100元,花出去30元,还剩下70元

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 30
QUEUED
127.0.0.1:6379> incrby out 30
QUEUED
127.0.0.1:6379> exec
1) (integer) 70
2) (integer) 30
# watch在事务执行结束后就失效了

现在我们开两个客户端cli-1和cli-2,按照以下的命令和顺序执行

cli-1

1
2
3
4
5
6
7
8
127.0.0.1:6379> watch 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

cli-2

1
2
3
4
5
6
127.0.0.1:6379> get money
"70"
127.0.0.1:6379> incrby money 230
(integer) 300
127.0.0.1:6379> get money
"300"

cli-1

1
2
3
4
127.0.0.1:6379> exec # 监视的值发生了改变,所以该事务执行失败,这个时候money上的watch没有解除,可以通过unwactch解除
(nil)
127.0.0.1:6379> get money
"300"
给作者买杯咖啡吧~~~