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

Redission可重试、超时续约的实现原理(源码分析)

Redission遇到其他进程已经占用资源的时候会在指定时间waitTime内进行重试。实现过程如下:

 执行获取锁的lua脚本时,会返回一个值,

如果获取锁成功,返回nil,也就是java里的null

如果获取锁失败,用语句“PTTL KEYS[1]”返回当前锁的剩余有效时间

最终返回到tryLock()函数里,成为局部变量ttl的值,

time是剩余等待时间的值,单位ms

ttl是当前锁的剩余有效时间,单位ms

用了redis里的pubsub机制:

同时在unlock()函数时候会执行一个redis指令:publish,广播该锁已经释放

 然后在tryLock()函数里会subscribe这个redis的广播,(订阅该广播,也就是订阅别人释放锁的信号)

接下来会在time的剩余时间内,等待别人释放锁的信号。当收到别人释放锁的信号,并且还在time时间内,就会再次尝试获取锁

WatchDog机制

如果未设置超时释放时间,那么会设置一个30s的默认过期时间,也就是Watchdog,然后开启一个任务(下图大红框)

每当时间到达设定等待时间的1/3时候,就会执行redis指令刷新锁的HSET的过期时间,这样就能给锁无限续期了


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

相关文章:

  • 多旋翼+航模+直升机:多型号无人机飞行表演技术详解
  • LeetCode 贪心算法经典题目 (C++实现)
  • 网络空间安全(2)应用程序安全
  • 机器人“战场”:创新、落地与未来
  • PyCharm Professional 2025 安装配置全流程指南(Windows平台)
  • Vue使用Three.js加载glb (gltf) 文件模型及实现简单的选中高亮、测距、测面积
  • 使用Kafka进行实时数据流处理的场景
  • Sky Hackathon 清水湾的水 AI美食助手
  • 数据结构:Map set - 习题(三)
  • 智能物联赋能城市照明升级——塔能科技的创新实践与城市转型
  • Reactor和Paroactor模型
  • [特殊字符]清华大学:DeepSeek从入门到精通.pdf(清华领航,驾驭DeepSeek,开启AI新境界)
  • 【Python爬虫(69)】解锁游戏数据宝藏:Python爬虫实战攻略
  • 基于TensorFlow.js与Web Worker的智能证件照生成方案
  • 阿里云 ACS:高效、弹性、低成本的容器计算解决方案
  • docker 中安装postgres
  • 基于YOLO11深度学习的半导体芯片缺陷检测系统【python源码+Pyqt5界面+数据集+训练代码】
  • 加油小程序实战教程01需求分析
  • Minio分布式多节点多驱动器集群部署
  • [AI]从零开始的树莓派运行DeepSeek模型教程