Redis分布式锁实现与Redisson原理
请详细介绍如何使用Redis实现分布式锁(SET NX EX命令),以及Redisson的看门狗(Watch Dog)机制如何自动续期。RedLock算法是什么?Redis分布式锁有哪些缺陷?
回答
我还是少年
基本Redis分布式锁:
- 加锁:
SET key value NX EX 30(NX表示不存在才设,EX设置过期时间) - 解锁:使用Lua脚本保证原子性(先get判断是否自己持有,再DEL)
- value使用UUID+线程ID标识锁持有者,防止删除他人锁
Redisson看门狗(Watch Dog):
- 加锁成功后,后台启动一个定时任务(scheduleExpirationRenewal)
- 默认每10秒检查一次,若锁还在则延长过期时间(默认续到30秒)
- 客户端宕机后看门狗停止,锁自动过期释放,避免死锁
RedLock算法:
- 在N个(通常5个)独立的Redis节点上依次加锁
- 要求:半数以上节点加锁成功,且加锁时间<过期时间
- 分3步:①获取当前时间 ②依次在N个节点加锁 ③再次获取时间,总耗时<锁过期时间且成功数≥N/2+1
- 目的:解决Redis主从切换导致的锁丢失问题
缺陷:
- 主从切换时锁丢失(异步复制导致)
- RedLock依赖时钟同步(假设节点间时钟一致)
- 锁过期但业务未完成(看门狗只能一定程度上缓解)
- 性能不如Zookeeper分布式锁可靠
- RedLock存在争议(Martin Kleppmann曾发文批评)