当前位置: 首页 > article >正文

redis分布式锁实现Redisson+redlock中watch dog是如何判断当前线程是否持有锁进行续租的呢?

在 Redis 中,Watch Dog(看门狗)机制主要用于实现分布式锁的自动续期(如 Redisson 的 RedLock 实现)。其核心目的是确保当业务逻辑执行时间超过锁的初始过期时间(leaseTime)时,锁不会因过期而被其他线程/进程误获取。以下是 Watch Dog 判断当前线程是否持有锁并进行续租的核心逻辑:


1. 锁的唯一标识符

当线程成功获取锁时,Redis 中存储的锁值(Value)会包含一个 客户端唯一标识符(如 UUID)线程 ID。例如:

SET my_lock "客户端UUID:线程ID" NX PX 30000

这一标识符由客户端生成,确保全局唯一性,并保存在客户端内存中。


2. Watch Dog 的续租条件

Watch Dog 通过以下步骤判断当前线程是否持有锁:

  1. 检查本地锁状态
    客户端在内存中维护锁的持有状态。如果当前线程已释放锁(主动调用 unlock()),Watch Dog 会直接停止续租。

  2. 验证 Redis 中的锁值
    Watch Dog 定期(如每 10 秒)向 Redis 发送一个 原子性 Lua 脚本,执行以下操作:

    if redis.call("GET", KEYS[1]) == ARGV[1] then
        redis.call("PEXPIRE", KEYS[1], ARGV[2])
        return 1
    else
        return 0
    end
    
    • KEYS[1]:锁的名称(如 my_lock)。
    • ARGV[1]:预期的锁值(客户端 UUID + 线程 ID)。
    • ARGV[2]:新的过期时间(如 30000 毫秒)。

    只有当 Redis 中锁的值与客户端保存的标识符一致时,才会续期锁的过期时间。


3. 关键设计要点

  • 原子性操作
    通过 Lua 脚本确保 “检查锁值”“续期锁” 是原子操作,避免并发问题。

  • 本地状态与 Redis 状态的强一致性

    • 若 Redis 中的锁已被其他客户端抢占(值不匹配),Watch Dog 立即停止续租,客户端会抛出异常通知业务逻辑。
    • 若客户端崩溃,Watch Dog 停止运行,锁最终因过期自动释放,避免死锁。
  • 可重入锁的支持
    如果锁是重入的(同一线程多次获取锁),客户端内部通过计数器跟踪重入次数。Watch Dog 只在锁被完全释放(计数器归零)时停止续租。


4. 流程总结

  1. 客户端获取锁成功后,启动 Watch Dog 定时任务。
  2. Watch Dog 定期检查本地锁状态,若未释放则触发续租。
  3. 通过 Lua 脚本验证 Redis 中的锁值是否仍属于当前线程。
  4. 验证通过则续期锁的过期时间,否则放弃续租并处理锁失效逻辑。

5. 注意事项

  • 网络分区风险
    若客户端与 Redis 发生长时间网络分区,Watch Dog 可能无法续租,锁最终会过期。此时业务需自行处理锁失效后的逻辑(如回滚)。

  • 性能开销
    Watch Dog 的定时续期会增加 Redis 的负载,需合理设置续期间隔(如 Redisson 默认 lockWatchdogTimeout=30秒)。

通过上述机制,Watch Dog 在保证安全性的前提下,实现了分布式锁的自动续期,确保长任务执行期间锁的持有权不被意外释放。


http://www.kler.cn/a/592236.html

相关文章:

  • 事务隔离级别是?
  • kotlin 中的构造函数的作用
  • 黑盒问题的操作优化
  • TPAMI-2025 | 中山大学具身导航参数高效训练!NavCoT:通过解耦推理提升基于大模型的视觉语言导航
  • Python列表1
  • hexo+git pages搭建网站避坑QAQ
  • 基于BCLinux制作Apache HTTPD 2.4.63 的RPM安装包
  • JAVA-多线程join()等待一个线程
  • 精细护理:为进行性核上性麻痹患者筑牢生活防线
  • stm32第七天震动传感器
  • NLP高频面试题(四)——BN和LN的区别与联系,为什么attention要用LN
  • 五、AIGC大模型_09手动实现ReAct_Agent
  • linux /bin/bash丢失修复
  • Mac:Maven 下载+安装+环境配置(详细讲解)
  • 动态规划合集——动态规划基本原理
  • 蓝桥杯 - 中等 - 新手引导
  • React初学分享 事件绑定 组价通信 useState useEffect
  • Django 中@login_required 配置详解
  • 【深度学习】多目标融合算法(五):定制门控网络CGC(Customized Gate Control)
  • OpenBMC:BmcWeb添加路由4 设置method