RedLock 算法与争议

面试官问:"Redis 分布式锁用 RedLock 吗?"

小陈说:"RedLock 是...用多个 Redis 实例做锁?"

面试官追问:"RedLock 有什么争议?"

小陈说:"...不太清楚。"

RedLock 是 Redis 分布式锁中最具争议的话题。这道题能说清楚 RedLock 原理和争议的候选人,对分布式系统的 CAP 理论有较深理解。

一、RedLock 原理 🔴

1.1 单机锁的问题

-- 普通 Redis 锁(单机):
# Redis 挂了 → 锁丢失 → 并发问题

-- Redis 主从:
# 主库加锁成功 → 从库还没同步 → 主库挂了
# 新主库没有锁 → 其他客户端获取锁 → 并发问题

1.2 RedLock 的思路

RedLock:用 N 个独立的 Redis 实例加锁
成功条件:超过 N/2+1 个实例加锁成功

示例(N=5):
- 实例1: 加锁成功 ✓
- 实例2: 加锁成功 ✓
- 实例3: 加锁成功 ✓
- 实例4: 加锁失败 ✗
- 实例5: 加锁失败 ✗
结果:3/5 成功,RedLock 成功

1.3 RedLock 算法步骤

# RedLock 获取锁
def acquire_redlock(lock_key, timeout=10):
    lock_value = uuid.uuid4()
    success_count = 0

    for redis_client in redis_instances:  # N 个实例
        start_time = time.time()
        if redis_client.set(lock_key, lock_value, nx=True, ex=timeout):
            success_count += 1
        elapsed = time.time() - start_time

    # 成功条件:超过 N/2 个实例加锁成功
    return success_count > len(redis_instances) / 2

二、RedLock 的争议 🟡

2.1 Martin Kleppmann 的质疑

2016 年,分布式系统专家 Martin Kleppmann 发表了一篇文章质疑 RedLock:

质疑 1:时钟跳跃问题

-- Redis 锁的过期依赖本地时钟
-- 如果 Redis 实例的时钟跳跃(ntp 调整):
-- 1. 客户端 A 在实例 1~3 加锁成功(过期时间 10 秒)
-- 2. 实例 2 的时钟跳跃,提前了 5 秒
-- 3. 实例 2 的锁在 5 秒后自动释放
-- 4. 客户端 B 在实例 2 加锁成功
-- 5. 但客户端 A 还在执行(以为自己有锁)

质疑 2:异步模型的假设

RedLock 假设:
- 网络延迟有限
- 进程停顿有限
- 时钟漂移有限

但在 CAP 理论下:
- 网络分区时,RedLock 可能同时被两个客户端持有

2.2 Redis 作者的回应

-- Redis 作者 antirez 的回应:
-- 1. 时钟跳跃问题:可以通过减少锁持有时间、使用 drift factor 缓解
-- 2. 异步模型:RedLock 明确不是强一致的,是概率性正确的

-- drift factor:
-- 如果锁持有时间很短,时钟跳跃的影响很小
-- RedLock 可以加入 drift factor:
-- 如果锁持有时间远小于过期时间,即使时钟跳跃 1~2 秒也不影响

三、RedLock vs 单机 Redis 锁 🟡

3.1 对比

维度单机 Redis 锁RedLock
可用性低(单机挂了就没了)高(N/2+1 才失败)
复杂度高(需要 N 个独立实例)
可靠性一般较好(但不是完美)
性能低(N 倍网络开销)

3.2 什么时候用 RedLock?

-- 适合 RedLock 的场景:
-- 1. 对锁的可用性要求极高
-- 2. 能够部署多个独立 Redis 实例
-- 3. 锁持有时间很短

-- 不适合 RedLock 的场景:
-- 1. 锁持有时间长(增加冲突概率)
-- 2. 只需要最终一致性(单机锁足够)
-- 3. 性能要求高(RedLock 慢)

四、生产选型 🟢

4.1 选型建议

-- 一般场景:单机 Redis 锁足够
-- 如果单机 Redis 有主从,Sentinel 自动切换
-- 锁可能丢失,但业务可以接受

-- 强一致性场景:不用 Redis 锁
-- 使用 Zookeeper(强一致)
-- 或者数据库悲观锁

-- 高可用 + 性能:RedLock
-- 部署 5 个独立 Redis 实例
-- 接受 RedLock 的概率性失败

【面试官心理】 RedLock 是 Redis 面试中的高级话题。能说清楚 RedLock 原理和 Martin Kleppmann 质疑的候选人,说明他对分布式锁的 CAP 权衡有深入理解。


级别考察重点期望回答
P5基本原理N 个实例,超过一半成功
P6争议分析时钟跳跃、异步模型问题
P7深度权衡何时用 RedLock、何时不用