中间件速查手册
缓存与 KV 存储Distributed Lock

分布式锁 是什么?

多个实例抢同一个 key,抢到的才能进临界区

类比:厕所门上的「有人」牌子,挂了别人就不能进

为什么需要

单机用 synchronized 就够了,但服务部署了 3 个实例,本地锁管不到别人。需要一个所有实例都能看到的公共状态来裁决。

正确姿势

加锁、续期、解锁三步,每一步都有坑。

  • 加锁:SET lock:key <uuid> NX EX 30,一条命令保证原子性
  • 续期:业务没跑完锁先过期了,需要看门狗定时续(Redisson 已实现)
  • 解锁:Lua 脚本先比对 uuid 再 DEL,防止删掉别人的锁
  • 可重入:用 Hash 存 uuid + 重入次数

它不够可靠的地方

Redis 主从是异步复制,主节点加锁成功后挂了,锁还没同步到从节点,新主上锁就丢了。对一致性要求极高的场景(如扣款),用 ZooKeeper/etcd 的临时顺序节点更稳。

另一个思路是让操作本身幂等,能不靠锁就不靠锁。

它出现在这些中间件里

相关问题

相关概念