Commit 618218f 1 parent e744795 commit 618218f Copy full SHA for 618218f
File tree 1 file changed +6
-3
lines changed
1 file changed +6
-3
lines changed Original file line number Diff line number Diff line change 17
17
18
18
#### redis 最普通的分布式锁
19
19
20
- 第一个最普通的实现方式,就是在 redis 里创建一个 key,这样就算加锁。
20
+ 第一个最普通的实现方式,就是在 redis 里使用 ` setnx ` 命令创建一个 key,这样就算加锁。
21
+
21
22
22
23
``` r
23
- SET my : lock 随机值 NX PX 30000
24
+ SET resource_name my_random_value NX PX 30000
24
25
```
25
26
26
27
执行这个命令就 ok。
39
40
end
40
41
```
41
42
42
- 为啥要用随机值呢 ?因为如果某个客户端获取到了锁,但是阻塞了很长时间才执行完,比如说超过了 30s,此时可能已经自动释放锁了,此时可能别的客户端已经获取到了这个锁,要是你这个时候直接删除 key 的话会有问题,所以得用随机值加上面的 ` lua ` 脚本来释放锁。
43
+ 为啥要用 ` random_value ` 随机值呢 ?因为如果某个客户端获取到了锁,但是阻塞了很长时间才执行完,比如说超过了 30s,此时可能已经自动释放锁了,此时可能别的客户端已经获取到了这个锁,要是你这个时候直接删除 key 的话会有问题,所以得用随机值加上面的 ` lua ` 脚本来释放锁。
43
44
44
45
但是这样是肯定不行的。因为如果是普通的 redis 单实例,那就是单点故障。或者是 redis 普通主从,那 redis 主从异步复制,如果主节点挂了(key 就没有了),key 还没同步到从节点,此时从节点切换为主节点,别人就可以 set key,从而拿到锁。
45
46
55
56
56
57
![ redis-redlock] ( /images/redis-redlock.png )
57
58
59
+ [ Redis 官方] ( https://redis.io/ ) 给出了以上两种基于 Redis 实现分布式锁的方法,详细说明可以查看:https://redis.io/topics/distlock 。
60
+
58
61
### zk 分布式锁
59
62
60
63
zk 分布式锁,其实可以做的比较简单,就是某个节点尝试创建临时 znode,此时创建成功了就获取了这个锁;这个时候别的客户端来创建锁会失败,只能** 注册个监听器** 监听这个锁。释放锁就是删除这个 znode,一旦释放掉就会通知客户端,然后有一个等待着的客户端就可以再次重新加锁。
You can’t perform that action at this time.
0 commit comments