概述
分布式锁是协调便利,本身并非正确性保证。令牌让归属无歧义,看门狗让锁保持有效,fencing token 则保护资源免受延迟持有者影响。
关键步骤
- 以 SET NX PX 与随机令牌获取锁,并保存令牌以标识归属。
- 临界区执行期间在后台续期。
- 仅当存储的令牌匹配时才释放,并用 Lua 脚本保证原子性。
- 把 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);