Appearance
分布式锁:租约、所有权与过期后的写入风险
修订于 2026-10-12。本文不把任何单一锁算法描述为适用于所有一致性需求。
分布式锁用于协调多个进程访问共享资源。设计前先问:是否真的需要互斥?能否用数据库唯一约束、幂等键或任务分区直接保证业务结果?若锁过期后,旧持有者仍可能继续写入,单靠“我拿到过锁”无法证明当前仍有写入资格。
单节点 Redis 锁的边界
Redis 文档给出基于带过期时间的 SET NX 的基本模式。锁值应为每个持有者生成唯一标识;释放时先比较值再删除,避免旧持有者删掉新持有者的锁。锁的有效期必须覆盖预期工作时间,但运行时暂停、网络延迟和续约失败都可能改变实际情况。
Redis 主从复制通常是异步的;主节点刚授锁却未复制就故障,提升后的副本可能再次授锁。对不能容忍双持有的操作,必须明确故障模型,考虑带栅栏令牌的后端校验或更适合的协调机制。
检查清单
- 定义锁的作用域、租期、续约规则和失败处理。
- 在被保护的写入端验证旧持有者不会覆盖新结果。
- 测试进程暂停、锁过期、网络分区和服务切换。
- 记录等待时间、获取失败、续约失败和长时间持锁。
- 不要在锁失效后自动重试非幂等写入。