← 中文资源

简体中文版本

使用带隔离令牌的分布式锁

以令牌获取锁、用看门狗续期,并用 fencing token 保护临界区,使延迟的持有者无法破坏共享状态。

阅读英文原文

概述

分布式锁是协调便利,本身并非正确性保证。令牌让归属无歧义,看门狗让锁保持有效,fencing token 则保护资源免受延迟持有者影响。

关键步骤

  1. 以 SET NX PX 与随机令牌获取锁,并保存令牌以标识归属。
  2. 临界区执行期间在后台续期。
  3. 仅当存储的令牌匹配时才释放,并用 Lua 脚本保证原子性。
  4. 把 fencing token 传给受保护资源,拒绝更旧令牌的写入。

验证

  • 同一时刻只有一个进程持锁。
  • 持锁期间锁会被续期。
  • 过期释放不会删除他人的锁。
  • 更旧 fencing token 的写入被拒绝。

注意事项

  • 分布式锁不是事务,正确性仍取决于资源侧的 fencing。
  • 没有共识时 Redis 故障转移可能破坏互斥,故 fencing token 是必要的。

适用范围

本条目围绕「使用带隔离令牌的分布式锁」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。

const token = crypto.randomUUID();
await redis.set(key, token, 'NX', 'PX', 30000);
// release atomically only if we still own it
await redis.eval(LUA_RELEASE, 1, key, token);