mirror of
https://github.com/doocs/advanced-java.git
synced 2024-12-28 04:10:08 +08:00
docs(distributed-system): update distributed-lock-redis-vs-zookeeper.md
更新 Redis 分布式锁相关描述 详细说明查看:https://github.com/doocs/advanced-java/blob/master/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md
This commit is contained in:
parent
e744795038
commit
618218f1c1
@ -17,10 +17,11 @@
|
||||
|
||||
#### redis 最普通的分布式锁
|
||||
|
||||
第一个最普通的实现方式,就是在 redis 里创建一个 key,这样就算加锁。
|
||||
第一个最普通的实现方式,就是在 redis 里使用 `setnx` 命令创建一个 key,这样就算加锁。
|
||||
|
||||
|
||||
```r
|
||||
SET my:lock 随机值 NX PX 30000
|
||||
SET resource_name my_random_value NX PX 30000
|
||||
```
|
||||
|
||||
执行这个命令就 ok。
|
||||
@ -39,7 +40,7 @@ else
|
||||
end
|
||||
```
|
||||
|
||||
为啥要用随机值呢?因为如果某个客户端获取到了锁,但是阻塞了很长时间才执行完,比如说超过了 30s,此时可能已经自动释放锁了,此时可能别的客户端已经获取到了这个锁,要是你这个时候直接删除 key 的话会有问题,所以得用随机值加上面的 `lua` 脚本来释放锁。
|
||||
为啥要用 `random_value` 随机值呢?因为如果某个客户端获取到了锁,但是阻塞了很长时间才执行完,比如说超过了 30s,此时可能已经自动释放锁了,此时可能别的客户端已经获取到了这个锁,要是你这个时候直接删除 key 的话会有问题,所以得用随机值加上面的 `lua` 脚本来释放锁。
|
||||
|
||||
但是这样是肯定不行的。因为如果是普通的 redis 单实例,那就是单点故障。或者是 redis 普通主从,那 redis 主从异步复制,如果主节点挂了(key 就没有了),key 还没同步到从节点,此时从节点切换为主节点,别人就可以 set key,从而拿到锁。
|
||||
|
||||
@ -55,6 +56,8 @@ end
|
||||
|
||||
![redis-redlock](/images/redis-redlock.png)
|
||||
|
||||
[Redis 官方](https://redis.io/)给出了以上两种基于 Redis 实现分布式锁的方法,详细说明可以查看:https://redis.io/topics/distlock 。
|
||||
|
||||
### zk 分布式锁
|
||||
|
||||
zk 分布式锁,其实可以做的比较简单,就是某个节点尝试创建临时 znode,此时创建成功了就获取了这个锁;这个时候别的客户端来创建锁会失败,只能**注册个监听器**监听这个锁。释放锁就是删除这个 znode,一旦释放掉就会通知客户端,然后有一个等待着的客户端就可以再次重新加锁。
|
||||
|
Loading…
Reference in New Issue
Block a user