← 返回并发与锁
🌐 分布式锁
多台机器怎么互斥 —— Redis + Redisson
📊 分布式锁(Redis 实现)
❌ 自己写 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 锁。
并发与锁 · 分布式锁 · 全栈资料库