首页/数据/数据库速查/分布式锁:安全释放(Lua 比对后删除)
本包目录(495 条)
MySQL 基础与连接36 条SQL 语法52 条用户与权限21 条备份与恢复56 条主从复制与高可用53 条性能与调优57 条Redis 命令96 条
Redis 运维与场景124 条

分布式锁:安全释放(Lua 比对后删除)

释放锁必须「先确认还是自己的锁、再删除」,且两步要原子;Lua 脚本把 GET 比对与 DEL 合成一次执行,避免两步之间锁过期被他人获得后误删。

数据库速查数据更新于 2026-10-12

Lua 安全释放

Lua 安全释放
-- 只有 value 等于自己的 token 才删除
if redis.call('GET', KEYS[1]) == ARGV[1] then
  return redis.call('DEL', KEYS[1])
else
  return 0
end

调用方式

调用方式
EVAL "if redis.call('GET', KEYS[1]) == ARGV[1] then return redis.call('DEL', KEYS[1]) else return 0 end" 1 lock:order:42 6f1d2c4e
# 返回 1=删除成功(自己的锁);0=已不是自己的锁,不动
客户端库(Redisson 等)都用等价 Lua 实现解锁;自研锁照抄这段即可,KEYS/ARGV 不要拼进脚本文本。

易错点

  • GET 与 DEL 分两条命令写:锁在两步之间过期并被别人拿到时,会删掉别人的锁
  • 脚本里把 key 写死而不用 KEYS 参数:Cluster 下无法定位槽位

数据来源与参考

  • Redis 官方文档: 分布式锁
  • Redis 官方文档: EVAL

相关工具

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