1.1 KiB
1.1 KiB
- 为什么需要分布式锁
多线程多个线程竞争会导致系统出现问题,需要对资源实现互斥访问,分布式系统下的悲观锁
- 分布式锁需要具备的条件
- 互斥
- 高可用性
- 可重入
- 高性能
- 非阻塞
- 分布式锁的实现方案
-
基于 mysql 实行
-
基于分布式协调服务 ZooKeeper 实现
基于临时顺序节点和Watcher(事件监听器)
- 基于分布式键值存储系统 Redis 实现
SETNX(set if not exist)key value EX 3 过期时间 3s
DEL key,建议使用 Lua 脚本来通过 key 对应 value(唯一值)判断
需要保证 key 值和过期时间为一个原子操作,否则无法释放
锁的续期使用 Redission 实现,提供了一个专门监控和续期锁的看门狗,如果未执行完就延长锁的过期时间 RLock lock = redission. get ("lock") lock. lock () lock. unlock ()
集群下分布式锁的可靠性
通过 RedLock 算法解决,让客户端向集群中多个独立的 Redis 依次申请枷锁,半数以上的实例加锁成功才是获得分布式锁