Redission可重试、超时续约的实现原理

news/2025/2/23 12:56:13

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.niftyadmin.cn/n/5863416.html

相关文章

(三)趣学设计模式 之 抽象工厂模式!

目录 一、 啥是抽象工厂模式?二、 为什么要用抽象工厂模式?三、 抽象工厂模式怎么实现?四、 抽象工厂模式的应用场景五、 抽象工厂模式的优点和缺点六、 抽象工厂模式与工厂方法模式的区别七、 总结 🌟我的其他文章也讲解的比较有…

编程小白冲Kaggle每日打卡(12)--kaggle学堂:<机器学习简介>模型如何工作

Kaggle官方课程链接:How Models Work 本专栏旨在Kaggle官方课程的汉化,让大家更方便地看懂。 How Models Work 第一步,如果你是机器学习的新手。 Introduction 我们将从概述机器学习模型的工作原理和使用方法开始。如果你以前做过统计建模…

YOLOv8与DAttention机制的融合:复杂场景下目标检测性能的增强

文章目录 1. YOLOv8简介2. DAttention (DAT)注意力机制概述2.1 DAttention机制的工作原理 3. YOLOv8与DAttention (DAT)的结合3.1 引入DAT的动机3.2 集成方法3.3 代码实现 4. 实验与结果分析4.1 实验设置4.2 结果分析推理速度性能对比 5. 深度分析:DAttention在YOLO…

分发糖果(力扣135)

题目说相邻的两个孩子中评分更高的孩子获得的糖果更多,表示我们既要考虑到跟左边的孩子比较,也要考虑右边的孩子,但是我们如果两边一起考虑一定会顾此失彼。这里就引入一个思想:先满足右边大于左边时的糖果分发情况,再…

贪心算法

int a[1000], b5, c8; swap(b, c); // 交换操作 memset(a, 0, sizeof(a)); // 初始化为0或-1 引导问题 为一个小老鼠准备了M磅的猫粮,准备去和看守仓库的猫做交易,因为仓库里有小老鼠喜欢吃的五香豆,第i个房间有J[i] 磅的五香豆&#xf…

【HeadFirst系列之HeadFirstJava】第3天之从零开始理解Java中的主数据类型和引用

从零开始理解Java中的主数据类型和引用 《Head First Java》是一本非常适合初学者的Java入门书籍,它以轻松幽默的方式讲解了Java的核心概念。在第三章节中,书中详细介绍了Java的主数据类型(Primitive Types)和引用(Re…

SpringBoot中实现限流和熔断功能

我们将使用Java的ScheduledExecutorService来实现一个简单的令牌桶算法(Token Bucket Algorithm),并结合一个自定义的服务类来处理第三方API调用。 1. 创建限流器 首先,创建一个简单的限流器类: import java.util.concurrent.*;public class SimpleRateLimiter {

计算机专业知识【数据库完整性约束:数据质量的坚固防线】

在数据库管理的领域中,数据的准确性、一致性和可靠性是至关重要的。为了保障这些特性,我们引入了各种完整性约束机制。接下来,就为大家详细介绍用户定义的完整性约束、实体完整性约束、参照完整性约束和关键字完整性约束,让数据库…