️ 博主介绍
大家好,我是 一个搬砖的农民工,很高兴认识大家 ~
个人介绍:本人是一名后端Java开发工程师,坐标北京 ~
感谢关注 一起学习 一起讨论 一起进步 ~
作者水平有限,欢迎各位大佬指正留言,相互学习进步 ~
在分布式系统中,多个节点可能同时访问共享资源,导致数据不一致或竞态条件。分布式锁通过协调不同节点对共享资源的访问,确保数据的一致性和并发访问的安全性。
Redisson分布式锁主要基于Redis的SETNX
(Set if Not Exists)命令和DEL
(Delete)命令实现。SETNX
命令尝试设置一个值,如果该键不存在,则设置成功并返回1
;否则返回0
。DEL
命令则用于删除一个键。
leaseTime
线程获取锁后,Redisson会立即启动一个后台的定时任务(看门狗)来定期检查锁的状态。30秒
)的三分之一(即10秒)。leaseTime
的锁;设置了 leaseTime
的锁不会有看门狗机制,会根据设置的过期时间自然过期。当一个线程完成临界区的操作后,应当手动释放锁。在Redisson中,这通常通过调用unlock()
方法来完成。如果线程没有手动释放锁,而是异常结束或被其他方式中断,Redis的键空间通知功能可以确保锁在一段时间后自动释放。
waitTime
: 表示在尝试获取锁之前,线程会等待多长时间(前提:锁被占用)。当waitTime设置为大于0的值时,线程在尝试获取锁时会在指定的时间内等待。如果在这段时间内锁没有被获取到,tryLock方法将返回false。
leaseTime
: 表示锁的持有时间,即锁在自动释放之前可以保持多久。
unit
: 时间单位,用于指定waitTime和leaseTime的时间单位。
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);
tryLock()
方法默认会有看门狗机制,因为没有设置过期时间,默认是30s
过期,但是看门狗每10s
续期一次,每次续期都重新设置过期时间为30s
。如果没有释放锁,理论上会无限续期。
// 源码
public boolean tryLock(long waitTime, TimeUnit unit) throws InterruptedException {
return this.tryLock(waitTime, -1L, unit);
}
因为这个方法没有设置 leaseTime,因此默认也是有看门狗机制的。默认是30s
过期,但是看门狗每10s
续期一次,每次续期都重新设置过期时间为30s
。如果没有释放锁,理论上会无限续期。
设置了 leaseTime 不会有看门狗机制
// 源码
public void lock(long leaseTime, TimeUnit unit) {
try {
this.lockInterruptibly(leaseTime, unit);
} catch (InterruptedException var5) {
Thread.currentThread().interrupt();
}
}
设置了 leaseTime 不会有看门狗机制
// 源码
public boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException {
long time = unit.toMillis(waitTime);
long current = System.currentTimeMillis();
...........
}
当一个没有设置leaseTime
的锁一创建 Redisson
就会生成一个对应的看门狗,如果执行了unlock()
则看门狗会一起销毁。不然会直到java进程终止(重启、销毁)才会消失。
是的,看门狗机制是Redisson
后台启的一个定时任务,不是Redis
自带的。