分布式锁没释放导致接口全卡住,怎么兜底

锁没释放通常不是忘了写释放逻辑,而是释放逻辑没被执行到。两个必做:一是加锁时就设过期时间(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
喜欢就支持一下吧
点赞8 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容