Skip to content

分布式锁:租约、所有权与过期后的写入风险 ​

修订于 2026-10-12。本文不把任何单一锁算法描述为适用于所有一致性需求。

分布式锁用于协调多个进程访问共享资源。设计前先问:是否真的需要互斥?能否用数据库唯一约束、幂等键或任务分区直接保证业务结果?若锁过期后,旧持有者仍可能继续写入,单靠“我拿到过锁”无法证明当前仍有写入资格。

单节点 Redis 锁的边界 ​

Redis 文档给出基于带过期时间的 SET NX 的基本模式。锁值应为每个持有者生成唯一标识;释放时先比较值再删除,避免旧持有者删掉新持有者的锁。锁的有效期必须覆盖预期工作时间,但运行时暂停、网络延迟和续约失败都可能改变实际情况。

Redis 主从复制通常是异步的;主节点刚授锁却未复制就故障,提升后的副本可能再次授锁。对不能容忍双持有的操作,必须明确故障模型,考虑带栅栏令牌的后端校验或更适合的协调机制。

检查清单 ​

  • 定义锁的作用域、租期、续约规则和失败处理。
  • 在被保护的写入端验证旧持有者不会覆盖新结果。
  • 测试进程暂停、锁过期、网络分区和服务切换。
  • 记录等待时间、获取失败、续约失败和长时间持锁。
  • 不要在锁失效后自动重试非幂等写入。

参考资料 ​

梧桐和风 · 让复杂的技术讲得更清楚