Appearance
分布式锁
实现方式
基本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
endRedLock算法
流程
- 获取当前时间戳
- 依次向N个Redis实例获取锁
- 计算成功获取锁的数量
- 超过N/2+1且在有效期内,成功
- 失败则向所有实例释放锁
可靠性
- 多个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: 分布式锁要考虑什么?
- 互斥性:只能一个客户端获取
- 死锁:必须能自动/手动释放
- 性能:不能有单点故障
- 可重入:同一客户端可重复获取
Q: RedLock安全性?
理论上存在时钟漂移问题,但在实际环境中概率极低。
