CodeWalk

Redis分布式锁实现与Redisson原理

作者:我还是少年 · 2026-05-30 12:55

请详细介绍如何使用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主从切换导致的锁丢失问题

缺陷

  1. 主从切换时锁丢失(异步复制导致)
  2. RedLock依赖时钟同步(假设节点间时钟一致)
  3. 锁过期但业务未完成(看门狗只能一定程度上缓解)
  4. 性能不如Zookeeper分布式锁可靠
  5. RedLock存在争议(Martin Kleppmann曾发文批评)