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

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.lryc.cn/news/541955.html

相关文章:

  • java八股文-消息队列
  • 3分钟idea接入deepseek
  • 【DeepSeek与鸿蒙HarmonyOS:开启应用开发新次元】
  • 基于光度立体视觉的三维重建方法
  • 在VSCode中接入deepseek
  • DeepSeek掘金——VSCode 接入DeepSeek V3大模型,附使用说明
  • 申请SSL证书,如何完成域名验证
  • HTTP实验(ENSP模拟器实现)
  • AI工具评论
  • comfy UI节点缺失dlib库处理
  • STM32 HAL库I2C函数使用详解:以MPU6050传感器为例
  • 四步彻底卸载IDEA!!!
  • vue3 背景虚化,文字高亮效果
  • 开源一个可以调RGB三色的小灯棒子
  • 在聚类算法的领域特定语言(DSL)中添加一个度量矩阵组件
  • 【C++】list 链表的使用+模拟实现
  • AI助力小微企业技术开发规范化管理 | 杂谈
  • Android 实现 RTMP 推流:快速集成指南
  • pipeline 使用git parameter插件实现动态选择分支构造
  • postcss.config.js 动态配置基准值
  • DeepSeek 冲击(含本地化部署实践)
  • eNSP下载安装(eNsp、WinPcap、Wireshark、VirtualBox下载安装)
  • 利用Ai对生成的测试用例进行用例评审
  • C#上位机--跳转语句
  • `sh` 与 `bash` 的区别详解
  • *PyCharm 安装教程
  • [特殊字符] Elasticsearch 双剑合璧:HTTP API 与 Java API 实战整合指南
  • 网络和操作系统基础篇
  • Oracle 连接报错:“ORA-12541:TNS:no listener ”,服务组件中找不到监听服务
  • 内外网文件传输 安全、可控、便捷的跨网数据传输方案