Redisson 分布式锁源码 02:看门狗
前言#
说起 Redisson,比较耳熟能详的就是这个看门狗(Watchdog)机制。
本文就一起看看加锁成功之后的看门狗(Watchdog)是如何实现的?
加锁成功#
在前一篇文章中介绍了可重入锁加锁的逻辑,其中 RedissonLock#tryAcquireAsync
方法是进行异步加锁的逻辑。
回顾一下这个方法的入参:
- waitTime:-1;
- leaseTime:-1,加锁时未指定锁时间,则为 -1,如果指定,则是指定的时间;
- unit:null;
- threadId:当前线程 id。
其中的 tryLockInnerAsync
在之前已经介绍过了。
当加锁成功时,会返回 null,加锁失败,会返回当前锁的剩余时间。
所以这块会进入到红框标记的部分。
leaseTime 为加锁时间,默认不指定,所以会进入到 scheduleExpirationRenewal
方法,也就是今天的主题:看门狗。
至此可以得出一个结论:
Redisson 看门狗(Watchdog)在指定加锁时间时,是不会对锁时间自动续租的。
看门狗#
看门狗的一部分重点逻辑就在 renewExpiration
方法这里:
- 延迟调度,延迟时间为:
internalLockLeaseTime / 3
,就是 10s 左右后会调度这个 TimerTask; - 异步续租:逻辑都在 renewExpirationAsync 里面;
- 递归调用:当续租成功之后,重新调用
renewExpiration
自己,从而达到持续续租的目的; - 当然也不能一直无限续租,所以中间有一些判断逻辑,就是用来中断续租的。
续租逻辑#
这块也是一个 lua 脚本,就是将之前的 redis key 直接重新设置时间。
这样一通续租下来,就是在过了 10s 左右将锁的时间重新设置为 30s。
总结#
至此,看门狗介绍完毕,简要总结一下内容。
- 只有在未指定锁超时时间时才会使用看门狗;
- 看门狗默认续租时间是 10s 左右,
internalLockLeaseTime / 3
; - 可以通过 Config 统一设置看门狗的时间,设置
lockWatchdogTimeout
参数即可。
最后,同样使用一张图,进行下总结:
相关推荐#
作者:程序员小航
出处:https://www.cnblogs.com/liuzhihang/p/14966659.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
欢迎关注个人公众号:『 程序员小航 』
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!