生产级实战:基于Redisson的分布式锁高可用方案与源码级剖析
一、背景与痛点
在电商秒杀场景中,我们面临以下挑战:
-
超卖问题:多个实例同时扣减库存。
-
死锁问题:服务宕机导致锁未释放。
-
锁误删:A线程删掉了B线程的锁。
-
业务超时:业务执行时间超过锁过期时间。
-
Redis抖动:Redis超时导致大面积锁失效。
二、为什么选择 Redisson 而非原生 Jedis?
原生的 SET key random_value NX PX 30000 虽然能实现互斥,但我们需要自己处理:
-
锁续期(Watchdog):业务没执行完,锁过期了怎么办?
-
可重入性:同一个线程内递归调用怎么办?
-
集群容错:Redis Master宕机,锁信息未同步到Slave怎么办?(虽然Redisson也无法完全解决Redlock争议,但在CAP中做了很好的折中)。
Redisson 底层封装了 Netty,实现了 Lua脚本原子操作 和 看门狗机制,是Java分布式锁的事实标准。
三、生产级代码实战
1. 依赖配置 (POM)
2. Redisson 生产级配置 (YAML)
生产环境务必配置 连接池、超时时间 和 重试机制。
3. Redisson Config Bean (Java Config)
4. 核心业务:库存扣减 Service (含熔断与降级)
这是本文的重点。我们不仅要加锁,还要处理 业务异常 和 Redis不可用 的情况。
5. 高级特性:公平锁与读写锁
在某些场景下,我们需要更精细的控制。
5.1 公平锁 (Fair Lock)
防止饥饿线程,先到先得。
5.2 读写锁 (ReadWrite Lock)
适用于读多写少的场景(如商品详情页)。
四、源码级深度剖析:看门狗机制 (Watchdog)
很多同学只知道看门狗会自动续期,但不知道原理。我们来看 RedissonLock 的核心源码:
原理总结:
-
如果我们在加锁时未指定
leaseTime,Redisson会启用看门狗。 -
看门狗会在锁过期前 1/3 的时间(默认10秒)执行一次
renew操作,重置过期时间。 -
如果服务宕机,Netty的
TimerTask停止,锁会在30秒后自动释放,避免死锁。
五、生产环境避坑指南
-
时钟同步:确保集群内所有服务器NTP时间同步,虽然Redisson主要依赖Redis时间,但业务逻辑可能依赖本地时间。
-
Key设计:锁的Key必须唯一且具有业务含义(如
order_id,product_id),避免锁范围过大(全局锁)或过小(无效锁)。 -
避免热Key:如果某个商品是超级热点(如iPhone首发),单个Redis Key可能会成为瓶颈。解决方案:Key分片(将库存拆分成10份,Key为
stock:product_id:01到stock:product_id:10)。 -
监控告警:监控Redis的
blocked_clients、connected_clients以及lock wait time。一旦锁等待时间过长,立即告警。 -
Lua脚本原子性:Redisson的所有锁操作都是Lua脚本,保证了
SET + EXPIRE的原子性,这是生产级应用的基石。
六、总结
生产级的分布式锁不仅仅是 SETNX。本文通过 Redisson 实现了具备 自动续期、可重入、防误删 以及 熔断降级 能力的库存扣减方案。
本文由

浙公网安备 33010602011771号