首页/数据/数据库速查/分布式锁落地的六个高频坑
Redis 运维与场景124 条

分布式锁落地的六个高频坑

锁粒度、重入、误删、续期、集群槽位与 fencing 是自研 Redis 锁最常翻车的地方;加锁前先想清楚「锁谁、锁多久、失败怎么办」。

数据库速查数据更新于 2026-10-12
  • 锁粒度:锁到资源 ID(lock:order:42),不要一把全局锁串行化所有请求
  • 重入:同一执行流重复加锁需计数(Hash 存 token->次数),否则自己把自己锁死
  • 误删:释放必须校验 token,见安全释放条目
  • 续期:TTL 要覆盖 P99 耗时,长任务配看门狗
  • 集群:锁 key 与业务 key 用同一 hash tag 保持同槽,避免 CROSSSLOT
  • 兜底:锁只降低并发概率,关键写入用唯一索引/版本号/fencing 拒旧值

fencing token 思路

fencing token 思路
# 用单调递增编号作为「代际」,下游只接受更大编号
INCR lock:job:fence          # -> 7
# 携 token=7 写库;存储层记录 max_seen:编号 <= max_seen 的写入一律拒绝
UPDATE jobs SET data='...', fence=7 WHERE id=42 AND fence < 7
TTL 与业务耗时关系:TTL 太短=频繁双持有者;TTL 太长=宕机后人工介入窗口大。常见折中是 TTL 10-30s + 看门狗。

易错点

  • 不设 TTL:持有者崩溃后只能手动 DEL 恢复
  • 把 Redis 锁当强一致机制:时钟/暂停问题下的双持有者窗口永远存在

数据来源与参考

  • Redis 官方文档: 分布式锁
  • 分布式锁实践总结

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌