分布式锁的实现
Zookeeper实现分布式锁
- 创建临时有序的Znode,选举序号最小的子节点获取到锁(create -e -s /lock 创建临时有序节点)
- 没有获取到锁的子节点监听比它小的前一个的子节点
- 执行完,删除子节点
Redis实现分布式锁
- setnx + 过期时间 获取锁(过期时间不好评估,开启一个守护线程,定时去检测这个锁的失效时间,然后续期)
- 通过一个唯一标识来确定锁(防止释放的不是自己所获取到的锁)
- lua脚本保证获取值和释放锁的原子性
若redis是集群,当主机宕机,进行主从切换,锁会丢失,引入redlock
- 5台redis实例作为主机,不使用集群,获取当前客户端的的时间T1
- setnx + 过期时间 获取锁,获取当前客户端的时间T2
- 获取到redis的实例个数>=3,并且T2-T1小于过期时间,成功获取到锁
- 执行完逻辑,一一释放锁

浙公网安备 33010602011771号