当前位置: 首页 > 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的过期时间,这样就能给锁无限续期了

相关文章:

  • 如何在望获实时 Linux 京博航友善 NanoPC-T6 上部署 Docker
  • 深入解析与操作:基于C++的PE文件处理技术揭秘
  • Docker部署中SQLite数据库同步问题解析
  • 备忘录模式:快速恢复原始数据
  • CSS 媒体查询:从入门到精通,打造跨设备完美体验
  • hot100_108. 将有序数组转换为二叉搜索树
  • sqlclchery面对复杂的sql语句怎么办
  • Jenkins上无法查看已成功生成的Junit报告
  • 从人机环境系统智能角度看传统IP的全球化二次创作法则
  • 前端防重复请求终极方案:从Loading地狱到精准拦截的架构升级
  • 设计模式之装饰器设计模式/包装设计模式
  • 【HeadFirst系列之HeadFirstJava】第3天之从零开始理解Java中的主数据类型和引用
  • 在聚类算法的领域特定语言(DSL)中添加一个度量矩阵组件
  • 游戏开发 游戏项目介绍
  • 记录首次安装远古时代所需的运行环境成功npm install --save-dev node-sass
  • 百度首页上线 DeepSeek 入口,免费使用
  • C++常量成员函数定义与使用
  • 详细介绍STM32(32位单片机)外设应用
  • 【CVPR2024-工业异常检测】PromptAD:与只有正常样本的少样本异常检测的学习提示
  • Redisson 的 RRateLimiter 限流
  • 天津装修公司排名前十名/网站seo推广营销
  • 新网站域名备案流程/图片外链
  • 棋牌游戏开发出售/单页网站怎么优化
  • 宁波建设网上银行/seow
  • 网站售后服务模板/百度账号怎么改名字
  • 青岛企业网站模板建站/太原关键词优化软件