上面这一段代码最主要的内容讲述看门狗机制的实际上应该算是 tryAcquire
最终落地为tryAcquireAsync
//如果获取锁失败,返回的结果是这个key的剩余有效期RFuture<Long> ttlRemainingFuture = this.tryLockInnerAsync(waitTime, this.commandExecutor.getConnectionManager().getCfg().getLockWatchdogTimeout(), TimeUnit.MILLISECONDS, threadId, RedisCommands.EVAL_LONG);//上面获取锁回调成功之后 , 执行这代码块的内容ttlRemainingFuture.onComplete((ttlRemaining, e) -> {//不存在异常if (e == null) {//剩余有效期为nullif (ttlRemaining == null) {//这个函数是解决最长等待有效期的问题this.scheduleExpirationRenewal(threadId);}}});return ttlRemainingFuture;
调用tryLockInnerAsync,如果获取锁失败,返回的结果是这个key的剩余有效期 , 如果获取锁成功,则返回null 。
【一文详解分布式锁的看门狗机制】获取锁成功后,如果检测不存在异常并且获取锁成功(ttlRemaining == null) 。
那么则执行this.scheduleExpirationRenewal(threadId);来启动看门狗机制 。
看门狗机制提供的默认超时时间是30*1000毫秒,也就是30秒
如果一个线程获取锁后,运行程序到释放锁所花费的时间大于锁自动释放时间(也就是看门狗机制提供的超时时间30s),那么Redission会自动给redis中的目标锁延长超时时间 。
在Redission中想要启动看门狗机制,那么我们就不用获取锁的时候自己定义leaseTime(锁自动释放时间) 。
但是 Redisson 和我们自己定义实现分布式锁不一样,如果自己定义了锁自动释放时间的话,无论是通过lock还是tryLock方法 , 都无法启用看门狗机制 。
所以你了解分布式锁的看门狗机制了么?
推荐阅读
- 电脑里面的操作系统安装教程 电脑操作系统快速安装详解
- cdr应该咋的才能量尺寸,光模块的具体参数详解
- 一文读懂 AutoGPT 开源 AI Agents
- 集中式数据库与分布式数据库的战场与战争
- Spring Cloud 实现分布式实时日志分析采集的三种方案
- 基于分布式学习的隐私保护技术研究
- 金钻的养殖方法及技巧详解图 金钻的养殖方法及技巧详解
- XXL-JOB真的要凉了?出现了一个王炸级别的分布式任务调度与计算框架?
- 一文了解低级和高级编程语言
- 食品的电子“身份证”都包含哪些信息?一文读懂