首页/数据/Redis 进阶速查/分布式锁:SET NX PX 与安全释放
数据结构与选型42 条

分布式锁:SET NX PX 与安全释放

加锁用 SET key value NX PX ttl 一步完成(原子),value 用唯一标识(如 UUID 加线程号);释放时必须校验持有者,避免误删他人锁。

Redis 进阶速查数据更新于 2026-10-12
加锁SET lock:order:1001 <uuid> NX PX 30000
释放Lua 比较 value 后 DEL
续期业务未完成时按剩余时间延长 TTL

加锁示例

加锁示例
redis-cli SET lock:order:1001 d9f2-8c01 NX PX 30000

安全释放脚本

安全释放脚本
if redis.call('GET', KEYS[1]) == ARGV[1] then
  return redis.call('DEL', KEYS[1])
else
  return 0
end
长任务需要看门狗线程续期;锁过期与业务超时必须设计成幂等可重入,锁只是降低并发概率。

易错点

  • 先 GET 再 DEL 的两步写法在并发下会删掉别人刚拿到的锁,必须用 Lua 或 GETDEL 原子比较删除
  • 主从切换窗口里锁可能丢失(异步复制),对一致性极端敏感的场景需评估 Redlock 或改用共识系统

数据来源与参考

  • Redis 官方文档:SET 命令(NX/PX 选项)
  • Redis 官方文档:分布式锁模式
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌