锁没释放通常不是忘了写释放逻辑,而是释放逻辑没被执行到。两个必做:一是加锁时就设过期时间(Redis 的 SET 带 EX,或 Redisson 的 leaseTime),绝不能设成永不过期;二是释放前校验持有者,用 Lua 把「判断是不是自己的锁」和「删除」做成原子操作,否则会把别人的锁删掉。业务耗时可能超长时用看门狗续期,并给业务本身也设超时兜底。
SET lock:order:123 <uuid> NX EX 30
-- 释放时先比对 value,再用 Lua 保证原子
if redis.call('GET', KEYS[1]) == ARGV[1] then
return redis.call('DEL', KEYS[1])
end
return 0
THE END






暂无评论内容