跳转至

从 CAP 角度解释 Redis 和 Zookeeper 锁架构

一、CAP 回顾

  • C 一致性:所有节点看到相同数据。
  • A 可用性:每个请求都有响应。
  • P 分区容忍:网络分区时还能运行。

分布式系统只能三选二。

二、Redis 锁:AP

Redis 主从

  • 异步复制。
  • 主节点挂了,从节点提升,锁可能丢。
  • 牺牲一致性换可用性。

RedLock

向 N 个独立节点加锁,多数成功。

  • 提高了一致性概率。
  • 但还是 AP:网络分区时,少数派节点仍能响应加锁请求。

特点

  • 高可用(任何节点可用就能加锁)。
  • 弱一致(极端情况可能两个客户端同时持有)。

三、Zookeeper 锁:CP

ZAB 协议

  • Zookeeper 用 ZAB,过半节点写成功才返回。
  • Leader 挂了,选主期间不可用。

临时节点 + Watcher

加锁: 1. 在 /locks/lock 下创建临时顺序节点。 2. 判断自己是不是最小的。 3. 不是,watch 前一个节点。

释放: - 客户端挂了,临时节点自动删除。 - watcher 通知下一个节点。

特点

  • 强一致(过半写成功)。
  • 主从切换期间不可用(CP)。
  • 锁不会丢(临时节点会话结束自动清)。

四、对比

Redis 锁 Zookeeper 锁
CAP AP CP
一致性
可用性 中(选主期间不可用)
性能
故障 可能丢锁 不丢锁
实现 SET NX 临时节点 + Watcher

五、怎么选

  • 性能优先,能容忍小概率失效:Redis。
  • 正确性优先,不能丢锁:Zookeeper / etcd。
  • 金融、库存、分布式事务:ZK。
  • 业务、缓存、限流:Redis。

面试要点

Redis 是 AP,Zookeeper 是 CP。不是谁好谁坏,是取舍。