缓存与 KV 存储Distributed Lock
分布式锁 是什么?
多个实例抢同一个 key,抢到的才能进临界区
类比:厕所门上的「有人」牌子,挂了别人就不能进
为什么需要
单机用 synchronized 就够了,但服务部署了 3 个实例,本地锁管不到别人。需要一个所有实例都能看到的公共状态来裁决。
正确姿势
加锁、续期、解锁三步,每一步都有坑。
- 加锁:SET lock:key <uuid> NX EX 30,一条命令保证原子性
- 续期:业务没跑完锁先过期了,需要看门狗定时续(Redisson 已实现)
- 解锁:Lua 脚本先比对 uuid 再 DEL,防止删掉别人的锁
- 可重入:用 Hash 存 uuid + 重入次数
它不够可靠的地方
Redis 主从是异步复制,主节点加锁成功后挂了,锁还没同步到从节点,新主上锁就丢了。对一致性要求极高的场景(如扣款),用 ZooKeeper/etcd 的临时顺序节点更稳。
另一个思路是让操作本身幂等,能不靠锁就不靠锁。