深入解析Redisson分布式锁看门狗机制

 更新时间:2025年06月10日 09:06:51   作者:一个搬砖的农民工  
本文主要介绍了深入解析Redisson分布式锁看门狗机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、Redisson分布式锁概述 🚀

☘️ 1.1 分布式锁的意义

在分布式系统中,多个节点可能同时访问共享资源,导致数据不一致或竞态条件。分布式锁通过协调不同节点对共享资源的访问,确保数据的一致性和并发访问的安全性。

☘️ 1.2 Redisson分布式锁的优势

  • 基于Redis实现:Redis作为高性能的内存数据库,提供了快速、稳定的存储服务,为Redisson分布式锁提供了坚实的基础。
  • 丰富的API:Redisson提供了丰富的Java API,使得分布式锁的使用更加简单、直观。
  • 自动续期机制:Redisson的分布式锁支持自动续期,避免了因业务处理时间过长导致的锁过期问题。
  • 可重入锁:Redisson的分布式锁支持可重入特性,即同一个线程可以多次获取同一把锁。

二、Redisson分布式锁的原理 🚀

🌳 2.1 锁的实现方式

Redisson分布式锁主要基于Redis的SETNX(Set if Not Exists)命令和DEL(Delete)命令实现。SETNX命令尝试设置一个值,如果该键不存在,则设置成功并返回1;否则返回0DEL命令则用于删除一个键。

🌳 2.2 看门狗机制

  • Redisson通过看门狗(Watch Dog)机制来实现锁的自动续期。当一个没有 leaseTime线程获取锁后,Redisson会立即启动一个后台的定时任务(看门狗)来定期检查锁的状态。
  • 看门狗的时间间隔通常是锁默认过期时间(如30秒)的三分之一(即10秒)。
  • 如果线程在锁的默认过期时间内完成了操作并释放了锁,看门狗会检测到锁的释放并取消该定时任务,避免不必要的资源消耗。
  • 看门狗机制只会针对没有设置 leaseTime 的锁;设置了 leaseTime 的锁不会有看门狗机制,会根据设置的过期时间自然过期。
  • 看门狗是由redisson维护的,当java服务进程中断时,看门狗也会中断,redis锁将自然过期。

🌳 2.3 锁的自动续期机制

  • 每当触发看门狗机制时,它会尝试自动续期,续期的时间长度通常是锁的默认过期时间(如再次设置为30秒),但也可以根据具体需求进行调整。

🌳 2.4 锁的释放

当一个线程完成临界区的操作后,应当手动释放锁。在Redisson中,这通常通过调用unlock()方法来完成。如果线程没有手动释放锁,而是异常结束或被其他方式中断,Redis的键空间通知功能可以确保锁在一段时间后自动释放。

三、Redisson 看门狗机制 🚀

🍁 3.1 参数说明

  • waitTime: 表示在尝试获取锁之前,线程会等待多长时间(前提:锁被占用)。当waitTime设置为大于0的值时,线程在尝试获取锁时会在指定的时间内等待。如果在这段时间内锁没有被获取到,tryLock方法将返回false。

  • leaseTime: 表示锁的持有时间,即锁在自动释放之前可以保持多久。

  • unit: 时间单位,用于指定waitTime和leaseTime的时间单位。

🍁 3.2 举例几个常见的方法

	RLock lock = redissonClient.getLock("lockKey001");

	// 没设置leaseTime,有看门狗机制
	lock.tryLock();
	// 实际调用的RedissonLock的tryLock(long waitTime, TimeUnit unit) 
	// 没设置leaseTime,有看门狗机制
	lock.tryLock(3, TimeUnit.SECONDS); 
	// 实际调用的RedissonLock的lock(long leaseTime, TimeUnit unit)方法
	// 设置了leaseTime,没有看门狗机制
	lock.lock(10, TimeUnit.SECONDS);
	// 设置了leaseTime=10s,没有看门狗机制
	lock.tryLock(3,10, TimeUnit.SECONDS);

🍁 3.3 tryLock()

tryLock() 方法默认会有看门狗机制,因为没有设置过期时间,默认是30s过期,但是看门狗每10s续期一次,每次续期都重新设置过期时间为30s。如果没有释放锁,理论上会无限续期。

🍁 3.4 tryLock(long waitTime, TimeUnit unit)

// 源码
 public boolean tryLock(long waitTime, TimeUnit unit) throws InterruptedException {
        return this.tryLock(waitTime, -1L, unit);
    }

因为这个方法没有设置 leaseTime,因此默认也是有看门狗机制的。默认是30s过期,但是看门狗每10s续期一次,每次续期都重新设置过期时间为30s。如果没有释放锁,理论上会无限续期。

🍁 3.5 lock(long leaseTime, TimeUnit unit)

设置了 leaseTime 不会有看门狗机制

 // 源码
 public void lock(long leaseTime, TimeUnit unit) {
        try {
            this.lockInterruptibly(leaseTime, unit);
        } catch (InterruptedException var5) {
            Thread.currentThread().interrupt();
        }
    }

🍁 3.6 tryLock(long waitTime, long leaseTime, TimeUnit unit)

设置了 leaseTime 不会有看门狗机制

// 源码
public boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException {
	long time = unit.toMillis(waitTime);
	long current = System.currentTimeMillis();
	...........
}

四、其他 🚀

🍄 4.1 看门狗生命周期

当一个没有设置leaseTime 的锁一创建 Redisson 就会生成一个对应的看门狗,如果执行了unlock()则看门狗会一起销毁。不然会直到java进程终止(重启、销毁)才会消失。

🍄 4.2 看门狗是Redisson 生成的吗

是的,看门狗机制是Redisson 后台启的一个定时任务,不是Redis自带的。

到此这篇关于深入解析Redisson分布式锁看门狗机制的文章就介绍到这了,更多相关Redisson分布式锁看门狗内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Redis基本数据类型哈希Hash常用操作命令

    Redis基本数据类型哈希Hash常用操作命令

    这篇文章主要为大家介绍了Redis基本数据类型哈希Hash常用操作,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Redis 常见缓存问题总结

    Redis 常见缓存问题总结

    这篇文章主要给大家总结了一些Redis 常见缓存问题,并介绍了解决办法,文中的图文示例介绍的非常仔细,感兴趣的同学可以参考阅读下
    2023-06-06
  • React中immutable的使用

    React中immutable的使用

    这篇文章主要介绍了React中immutable的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • redis由于目标计算机积极拒绝,无法连接的解决

    redis由于目标计算机积极拒绝,无法连接的解决

    这篇文章主要介绍了redis由于目标计算机积极拒绝,无法连接的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Redis序列化反序列化不一致导致String类型值多了双引号问题

    Redis序列化反序列化不一致导致String类型值多了双引号问题

    这篇文章主要介绍了Redis序列化反序列化不一致导致String类型值多了双引号问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Redis 实现队列原理的实例详解

    Redis 实现队列原理的实例详解

    这篇文章主要介绍了Redis 实现队列原理的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • Redis+Caffeine多级缓存数据一致性解决方案

    Redis+Caffeine多级缓存数据一致性解决方案

    两级缓存Redis+Caffeine可以解决缓存雪等问题也可以提高接口的性能,但是可能会出现缓存一致性问题,如果数据频繁的变更,可能会导致Redis和Caffeine数据不一致的问题,所以本文给大家介绍了Redis+Caffeine多级缓存数据一致性解决方案,需要的朋友可以参考下
    2024-12-12
  • Redis的双写问题解决

    Redis的双写问题解决

    本文主要介绍了Redis的双写问题解决,这种问题在使用 Redis 作为缓存层时尤为常见,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • Win10配置redis服务实现过程详解

    Win10配置redis服务实现过程详解

    这篇文章主要介绍了Win10配置redis服务实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • python脚本实现Redis未授权批量提权

    python脚本实现Redis未授权批量提权

    这篇文章主要给大家介绍了关于利用python脚本实现redis未授权批量提权的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-09-09

最新评论