首页/案例库/Redis 分布式锁
专家分布式系统

Redis 分布式锁

高并发下的资源互斥与死锁预防

双十一秒杀场景:10 万个请求同时到达,争抢最后一件库存。没有锁的情况下,并发读写会导致超卖;用数据库行锁又会拖垮 TPS。Redis 的 SET NX PX 是一条原子指令,「不存在就设置」的语义天然等同于抢锁——只有第一个请求成功,其余全部失败并重试。TTL 防止持锁进程崩溃后锁永久不释放(死锁)。Redlock 算法则通过向 5 个独立 Redis 节点同时申请锁、要求多数派(3/5)成功,在单节点故障场景下仍能保证互斥性。

SET NX PXLua ScriptRedlock看门狗死锁
STEP_1
SET NX PX 原子命令 + 唯一 UUID 标识
Instance A — SET NX lock:sku_001OK
Instance B — SET NX lock:sku_001(nil)
Instance C — SET NX lock:sku_001(nil)
lock-acquire.log
// 多实例并发竞争
// Instance A
SET lock:product:sku_001 "uuid-A"
  NX        // 不存在时才写入
  PX 30000  // 30秒自动过期(防死锁)

// Redis 原子执行:
// → Instance A: OK (加锁成功)
// → Instance B: (nil) (加锁失败)
// → Instance C: (nil) (加锁失败)

// B, C 进入重试或放弃流程

竞争加锁多个服务实例同时对同一 Key 执行 SET NX(Not eXists)原子操作,Redis 单线程保证只有一个实例成功加锁。

实时沙盒SANDBOX
DEGRADED
快速场景
手动调节
并发客户端数
Concurrent Clients
10
锁竞争合理
锁 TTL 时长
Lock Expiry Time
5000ms
TTL 过短,业务未完成锁已过期,导致并发问题
Redis 节点宕机
所有节点正常运行