您的位置:首页 > 文旅 > 旅游 > Redisson看门狗机制和mulitLock原理保姆级别

Redisson看门狗机制和mulitLock原理保姆级别

2024/10/9 11:21:25 来源:https://blog.csdn.net/ppp666777/article/details/140963801  浏览:    关键词:Redisson看门狗机制和mulitLock原理保姆级别

Redisson看门狗机制

这段代码主要实现了异步处理一个任务,并根据任务结果来执行不同的操作。

首先,调用handleNoSync方法进行异步处理,并返回一个表示异步计算结果的CompletionStage<Long>对象,这里使用了threadId和ttlRemainingFuture作为参数。

然后,通过CompletableFutureWrapper将上一步返回的CompletionStage包装起来,创建一个新的CompletableFutureWrapper对象。

接下来,调用ttlRemainingFuture.thenApply方法,注册一个回调函数来处理异步任务的结果。这个回调函数接收一个ttlRemaining参数,表示异步任务的结果。

在回调函数中,首先判断ttlRemaining是否为null。如果是null,则根据leaseTime的值执行不同的操作:

如果leaseTime大于0,则将internalLockLeaseTime设置为leaseTime的毫秒值。

如果leaseTime小于等于0,则调用scheduleExpirationRenewal方法进行过期时间的续期操作,传入threadId作为参数。

最后,回调函数返回ttlRemaining作为新的CompletionStage<Long>对象的结果。

整个代码段利用了CompletableFuture和CompletionStage来实现异步任务的处理和结果的回调。

创建了一个ExpirationEntry对象,并放入hashmap中,key为他的名字,vale为他自己,只有当这个entry实体不存才的时候才会放入map中,这样保证了每次放入的都是新的entry实体然后将它加入线程中,如果它是第一次创建则会执行renewExpiration完成续约

 首先从集合中获取实体名字,然后开启一个延时任务它有两个参数,一个是延迟任务本身还有一个是延迟时间internalLockLeaseTime / 3 internalLockLeaseTime默认为30毫秒,也就是这个延时任务每10秒执行一次。首先获取entry名字和线程id。

然后执行renewExpirationAsync方法开始重新设置有效时间redis.call('pexpire', KEYS[1], ARGV[1])会重置当前有效时间

 之后它会递归的调用自己实现一直续约,最后将这个任务添加到实体中,所以一开始的map会用putifabsent,因为已经存在的实体一定是已经续约过的。不需要重复添加。

 redisson释放锁

先从map中将对应锁的实体取出来,然后分别获线程id和定时任务删除,最终完成锁的释放

redisson的mulitLock原理

首先redisson会将所有的redisclient添加到一个集合中

 根据是否传入等待时间和超时时间来设置

locakWaitTime其实等于remainTime定义failedLocksLimit 默认为0,进入for循环遍历锁的集合如果传入等待时间和超时时间则执行重试,否则执行一次。如果获取锁成功则添加到acquiredLocks集合中表示已经获取成功的集合。如果获取失败进行if判断failedLockLimit的默认值为0,只有当全部锁等于已成获取锁的数量时if条件才会成立,从而退出循环只有将所有的锁都成功获取才能退出,只要有一把锁获取失败就重新开始获取。进入下一个if判断将之前获取到的锁删掉,如果没有传递waitTime说明不需要重试,直接退出,然后将之前的锁全部清空,将迭代器中的指针移到第一个重新开始遍历 

如果等待时间大于0则计算剩余等待时间,当前时间减去刚才获取锁所消耗的时间

remainTime -= System.currentTimeMillis() - time;

time = System.currentTimeMillis();

如果剩余等待时间小于0则将所有成功获取的锁释放,只有将所有的锁都成功获取才能退出,只要有一把锁获取失败就重新开始获取

最后的if逻辑是为了保证所有锁的过期时间是一致的,过期时间是从获取锁成功后就开始减少,防止第一把锁的过期时间短而最后一把锁的过期时间长,最后返回true直到所有锁被成功获取

 

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com