一文详解分布式锁的看门狗机制( 二 )

上面这一段代码最主要的内容讲述看门狗机制的实际上应该算是 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方法 , 都无法启用看门狗机制 。
所以你了解分布式锁的看门狗机制了么?




推荐阅读