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

 

相关文章:

  • C++:dfs,bfs各两则
  • kotlin的Int类型调用toString()会导致空指针吗
  • CountDownlatch实现原理
  • 1.2.2 AI 技术的融入
  • Linux 文件的三个时间:Access、Modify 和 Change
  • 【服务器与本地互传文件】远端服务器的Linux系统 和 本地Windows系统 互传文件
  • 对网络物理层芯片LAN8720A的复位信号(复位引脚nRST)的详细分析(顺便也介绍下其软复位的操作和导常情况解决方法)
  • AMBA-CHI协议详解(十八)
  • [论文解析]OmniRe: Omni Urban Scene Reconstruction
  • Java中的Stream API:从入门到实战
  • C#初级教程(5)——解锁 C# 变量的更多奥秘:从基础到进阶的深度指南
  • GPIO外设
  • Python数据类型 NoneType和唯一实例None
  • 25轻化工程研究生复试面试问题汇总 轻化工程专业知识问题很全! 轻化工程复试全流程攻略 轻化工程考研复试真题汇总
  • brew Nushell mac升级版本
  • npm使用了代理,但是代理软件已经关闭导致创建失败
  • VOS3000线路对接、路由配置与路由分析操作教程
  • 前端八股——JS+ES6
  • always和assign语法区别
  • 内外网数据安全摆渡与FTP传输的对比
  • 宜昌谱写新叙事:长江大保护与高质量发展如何相互成就
  • 我的科学观|梅彦昌:科技创新关键在于能否跑得快,而不是有没有钱
  • 微软宣布将裁员3%
  • 筑牢安全防线、提升应急避难能力水平,5项国家标准发布
  • 牧原股份子公司与养殖户种猪买卖纠纷案一审胜诉
  • 山西省委常委李金科添新职