锁重试和看门狗机制 📅 2026/7/22 11:57:43 锁重试Lock Retry是什么加锁失败时不是立刻放弃而是等一会儿再试。Redisson 常见写法// waitTime1秒最多等1秒去抢锁// leaseTime10秒拿到锁后持有10秒指定了就不看门狗lock.tryLock(1,10,TimeUnit.SECONDS);你项目里就是这样if(!lock.tryLock(1,10,TimeUnit.SECONDS)) {return Result.fail(不能重复下单);}含义去 Redis 抢lock:order{userId}抢不到 →订阅锁释放消息 / 短暂等待后重试在 waitTime 内1 秒内还抢不到 → 返回false→ 你返回「不能重复下单」抢到了 → 持有10 秒因为你写了 leaseTime重试 ≠ 无限重试有时间上限waitTime。WatchDog看门狗是什么自动给锁续期的后台任务。触发条件很关键只有「没指定 leaseTime」时WatchDog 才会启动。写法WatchDoglock.lock()✅ 有lock.tryLock(waitTime, TimeUnit.SECONDS)只传等待时间✅ 有lock.tryLock(1, 10, TimeUnit.SECONDS)你现在这种❌没有有 WatchDog 时怎么工作加锁成功默认过期时间30 秒Redisson 后台线程大约每10 秒30/3检查一次若锁还在、还是当前线程持有 → 把过期时间重新设回 30 秒业务一直跑锁就一直续着unlock()之后 → 看门狗停掉锁真正释放加锁成功 ───────────────────────────────→ unlock| || 30s过期每10s续一次30→30→30... || |└────────── WatchDog 工作中 ───────────────┘为什么你现在的代码没有 WatchDog因为写了第二个参数10leaseTime。Redisson 认为「你已经说了持有 10 秒我就不帮你续了。」所以业务如果超过 10 秒锁会提前过期——这是隐患。更推荐的秒杀写法开启看门狗// 只写等待时间不写 leaseTime → 看门狗开启if(!lock.tryLock(1,TimeUnit.SECONDS)){returnResult.fail(不能重复下单);}try{// 业务逻辑}finally{lock.unlock();// 必须放 finally否则看门狗会一直续}这节面试怎么答30 秒Redisson 加锁失败时会在 waitTime 内重试。WatchDog 是自动续期机制不指定 leaseTime 时默认锁 30 秒每隔约 10 秒续一次防止业务没跑完锁过期指定了 leaseTime 就不会启动看门狗。解锁必须在 finally 里否则看门狗会一直续期。21. MultiLock联锁原理要解决什么问题一把锁锁一个资源。但有时要同时锁多个资源比如转账同时锁「账户 A」和「账户 B」下单扣多仓同时锁「仓库1库存」和「仓库2库存」如果一把一把加容易死锁线程1先锁A再锁B线程2先锁B再锁A→ 互相等死锁MultiLock 把多把锁当成一把「组合锁」来加/放。怎么用RLocklock1redisson.getLock(lock:account:A);RLocklock2redisson.getLock(lock:account:B);// 联锁多把锁合成一把RLockmultiLockredisson.getMultiLock(lock1, lock2);// 要么全成功要么当作失败内部会处理multiLock.lock();try{// 同时持有 A、B 两把锁做业务}finally{multiLock.unlock();}原理课里要懂的层次加锁对里面每一把RLock去加锁成功条件在超时时间内所有锁都加成功才算成功有一把失败把已经加上的锁全部释放然后按重试策略再试类似「全有或全无」解锁把所有子锁都 unlock可以把它想成MultiLock LockA LockB LockC加锁A✅ B✅ C✅ → 成功加锁A✅ B❌ → 释放A整体失败再重试解锁A、B、C 都放掉每把子锁本身仍是 Redisson 可重入锁也可以有自己的 WatchDog取决于你怎么 lock。MultiLock vs RedLock别混MultiLockRedLock锁什么多把不同业务锁不同 key同一把锁写到多个 Redis 节点目的同时保护多个资源提高锁在集群下的可靠性典型场景转账锁两个账户防主从切换丢锁课里第 21 节一般是MultiLock联锁不是 RedLock。RedLock 是另一套「多 Redis 实例」方案名字像别搞混。你秒杀项目用不用 MultiLock一般不用。你现在是lock:order{userId}一人一单一把锁就够。MultiLock 适合一次业务要互斥多个独立资源。秒杀优化后面会走「异步秒杀 Redis 库存」很多时候连这把用户锁都会弱化重点变成 Lua 原子扣库存。两节串起来记第19节 可重入锁同一线程能重复加同一把锁Hash 存次数第20节 重试看门狗抢不到就等着试拿到后自动续期别业务中途锁没了第21节 MultiLock多把锁打包全成功才算成功第22节 异步秒杀锁/库存往 Redis 前置下单异步落库和你当前代码的关系你现在tryLock(1, 10, SECONDS)✅ 有1 秒内重试❌没有 WatchDog因为写了 10 秒 leaseTime❌ 没用 MultiLock也不需要想开看门狗改成lock.tryLock(1,TimeUnit.SECONDS);// 去掉第二个时间参数并保证finally { lock.unlock(); }。要的话我下一块可以把第 19 节可重入锁原理Hash 结构、加锁次数也按同样方式讲透和这两节就齐了。