Skip to content

分布式锁

实现方式

基本SETNX

redis
SET lock_key unique_value NX PX 30000

参数说明:

  • NX:key不存在才设置
  • PX:过期时间(毫秒)
  • value:唯一标识(UUID)

解锁

lua
-- 必须判断value才能解锁
if redis.call("get", KEYS[1]) == ARGV[1] then
    return redis.call("del", KEYS[1])
else
    return 0
end

RedLock算法

流程

  1. 获取当前时间戳
  2. 依次向N个Redis实例获取锁
  3. 计算成功获取锁的数量
  4. 超过N/2+1且在有效期内,成功
  5. 失败则向所有实例释放锁

可靠性

  • 多个Redis实例,避免单点故障
  • 半数以上投票,更高可靠性

Watchdog(看门狗)

自动续期

lua
-- Redisson实现
if ttl > 0 then
    redis.call("pexpire", KEYS[1], ttl * 3)
end

每1/3 TTL时间自动续期。

可重入锁

lua
local counter = redis.call("incr", KEYS[1])
if counter == 1 then
    redis.call("expire", KEYS[1], ARGV[1])
end
return counter

面试考点

Q: 分布式锁要考虑什么?

  1. 互斥性:只能一个客户端获取
  2. 死锁:必须能自动/手动释放
  3. 性能:不能有单点故障
  4. 可重入:同一客户端可重复获取

Q: RedLock安全性?

理论上存在时钟漂移问题,但在实际环境中概率极低。

最后更新: