← 返回并发与锁

🌐 分布式锁

多台机器怎么互斥 —— Redis + Redisson

📊 分布式锁(Redis 实现)
机器 ASET lock NX(成功) 机器 BSET lock NX(失败) Redislock=A(已持有)B拿不到,等待 A执行完 DEL lockB才能拿到

❌ 自己写 SETNX(一堆坑)

① 业务没执行完锁就过期了(别人拿到锁,并发)
② finally 删锁时删了别人的锁
③ Redis 主从切换丢锁

✅ 用 Redisson(生产标准)

① 看门狗自动续期(默认30s,每10s续)
② 锁值带UUID,只删自己的
③ 可重入、可公平、支持RedLock

// Redisson 分布式锁(生产推荐) RLock lock = redissonClient.getLock("lock:order:" + orderId); try { boolean ok = lock.tryLock(5, 30, SECONDS); // 等待5s获取,持锁30s(看门狗会续期) if (!ok) throw new BusyException("系统繁忙"); orderService.process(orderId); } finally { if (lock.isHeldByCurrentThread()) { lock.unlock(); // 只解锁自己持有的 } }
三个坑:必须设过期时间(防持锁进程崩了死锁);② 解锁要判断value(防删别人的锁);③ 业务超时锁过期(用Redisson看门狗自动续期)。生产用Redisson,别自己写。
Redis vs Zookeeper:Redis 分布式锁是AP(高可用但可能极端丢锁);Zookeeper 是CP(强一致更可靠)。资金/库存要求绝对正确用 ZK 或 DB 锁。
并发与锁 · 分布式锁 · 全栈资料库