🧩 一、Redisson 分布式锁实现核心知识点
1. 锁的 key 特点
| 特点 | 描述 |
|---|---|
| 唯一性 | 每个锁 key 表示一个独立的资源,防止多客户端对同一资源同时操作 |
| 业务语义清晰 | 常使用业务标识拼接(如 lock:order:12345) |
| TTL机制 | 默认设置过期时间,防止因服务宕机导致锁不释放(死锁) |
| 可自动续期 | 结合 WatchDog 实现自动延期(Redisson 特有) |
2. Redisson 加锁方式
// 推荐写法,支持自动续期
RLock lock = redissonClient.getLock("lock:order:123");
lock.lock(); // 默认加锁 30 秒,后台 WatchDog 每 10 秒自动续期
// 非自动续期:指定 TTL 后不会自动续期
lock.lock(15, TimeUnit.SECONDS); // 指定锁15秒过期,WatchDog 不生效
🔄 二、Redisson 的 WatchDog 自动续期机制
✅ 自动续期原理
-
默认锁定时间:30秒
-
启动后台线程每 10 秒检查是否需要续期
-
如果业务仍在执行中,续期 +30 秒(不会重叠)
⛓️ 自动续期图示(WatchDog):
Client A 线程请求加锁 ➜ 加锁成功(30s)
⤷ 启动 WatchDog 守护线程,每 10s 检查锁状态
⤷ 若未释放 ➜ 延期 30s
⤷ 业务执行完 ➜ 手动 unlock() ➜ 结束续期
⚠️ 三、手动设定 TTL 与自动续期的区别
| 加锁方式 | 自动续期 | 适用场景 |
|---|---|---|
lock() | ✅ | 执行时间不确定的业务逻辑 |
lock(leaseTime, unit) | ❌ | 确定业务执行时间、自动释放锁 |
tryLock(timeout, unit) | ✅ | 限时尝试获取锁,获锁后自动续期 |
♻️ 四、Redisson 分布式锁的可重入机制
-
一个线程多次
lock()同一个 key,不会阻塞自己。 -
内部维护锁的 重入计数器,
unlock()次数 =lock()次数才真正释放锁。
RLock lock = redisson.getLock("lock:task");
lock.lock(); // 第一次加锁
lock.lock(); // 再次加锁,不会阻塞
lock.unlock(); // 减1,未释放
lock.unlock(); // 真正释放锁
🧱 五、Redisson 分布式锁 vs 原始 setnx 实现对比
| 特性 | Redisson | 原始 Redis setnx 实现 |
|---|---|---|
| 自动续期 | ✅ WatchDog 自动续期 | ❌ 需要自己实现定时任务 |
| 可重入 | ✅ 支持线程可重入锁 | ❌ 不支持 |
| 锁超时释放 | ✅ TTL 后自动删除 | ✅ 但要防止误删其他线程的锁 |
| 公平/读写锁支持 | ✅ 提供公平锁、读写锁等多种模式 | ❌ 需要自己封装 |
| 集群部署支持 | ✅ 内建支持 Redis 集群、哨兵 | ❌ 自己实现高可用较复杂 |
| 使用便捷性 | ✅ 高封装,高可靠 | ❌ 容易出错、重逻辑多 |
五、✅ Redisson 锁续期的两种方式(理解为“触发机制”)
| 续期方式 | 说明 |
|---|---|
| 1. 自动续期(WatchDog) | Redisson 默认行为,使用 lock() 时触发,看门狗线程每 10 秒自动续约一次 TTL,直到主动释放 |
| 2. 手动设定 TTL(不续期) | 使用 lock(long leaseTime, TimeUnit unit) 指定过期时间后,不再自动续期,TTL 到期自动释放锁 |
🎯 所以关键区别在于:
-
✅ WatchDog 是自动续期的核心机制;
-
❌ 如果你手动设置了锁的过期时间(比如 lock(15, TimeUnit.SECONDS)),Redisson 不会启动 WatchDog。
🧠 六、面试答题模板参考(简洁说辞)
1、我们项目中使用 Redisson 实现分布式锁,主要利用其自动续期机制(WatchDog),避免因执行时间不确定导致锁失效问题。
2、Redisson 默认每 10 秒续期一次锁 TTL,直到业务完成后手动释放,保证锁的可靠性。同时,它还支持可重入锁、读写锁、信号量等扩展能力,较原始 setnx 实现更健壮、易用。3、Redisson 的锁续期机制有两种触发方式:
一种是 自动续期,通过内部的 WatchDog 机制每 10 秒自动延长锁的 TTL,默认锁时间为 30 秒;
另一种是 手动指定 TTL,这种情况下锁会在指定时间后自动释放,但不会触发自动续期;
我们项目中使用默认 lock() 方式,以保证执行时间不可控的任务不会因 TTL 到期而丢锁。

1156

被折叠的 条评论
为什么被折叠?



