Redis 如何实现分布式锁?

发布于

一、基本实现

SET lock_key unique_value NX EX 30
  • NX:key 不存在才设置。
  • EX:过期时间,防止死锁。
  • unique_value:释放锁时校验,防止误删别人的锁。

二、释放锁(Lua 脚本保证原子)

if redis.call("get", KEYS[1]) == ARGV[1] then
    return redis.call("del", KEYS[1])
end
return 0

三、Redisson 实现

  • 可重入锁:维护计数器。
  • 看门狗:业务未执行完自动续期(默认 30s,每 10s 检查)。
  • 支持公平锁、读写锁、红锁。

四、注意事项

  • 必须设置过期时间,防止持锁节点宕机导致死锁。
  • 释放锁必须校验 value,避免误删。