面试题答案
一键面试基于Redis的分布式锁
- 锁的获取与释放性能
- 获取性能:Redis基于内存操作,且单线程模型避免了线程上下文切换开销,锁获取操作通常速度很快。如使用
SETNX
(Set if Not eXists)命令获取锁,时间复杂度为O(1)。 - 释放性能:释放锁只需执行
DEL
命令删除对应的键值对,时间复杂度同样为O(1),性能高效。
- 获取性能:Redis基于内存操作,且单线程模型避免了线程上下文切换开销,锁获取操作通常速度很快。如使用
- 锁的一致性保证
- 单节点Redis能保证强一致性,但在多节点集群模式(如Redis Cluster)下,由于数据同步存在一定延迟,可能出现短暂的不一致。比如在主从复制场景下,主节点刚获取锁还未同步到从节点,此时主节点故障,从节点提升为主节点,新主节点可能允许其他客户端获取同一把锁。
- 集群扩展时的处理机制
- Redis Cluster通过哈希槽(Hash Slot)进行数据分片,扩展时需迁移部分哈希槽的数据到新节点。分布式锁数据分布在不同节点,扩展可能导致锁的获取和释放逻辑需调整,如需要重新计算锁所在节点。同时,由于数据迁移过程中可能出现短暂的数据不一致,可能影响锁的一致性。
基于Zookeeper的分布式锁
- 锁的获取与释放性能
- 获取性能:Zookeeper采用树形结构存储数据,获取锁需在节点上创建临时顺序节点。由于Zookeeper是多节点集群,写操作(创建节点)需多数节点确认,相比Redis单节点写操作,性能会稍低,尤其是在大规模集群中,网络延迟和节点间通信开销会增大。
- 释放性能:释放锁只需删除对应的临时节点,由于Zookeeper的原子性操作保证,删除操作性能尚可,但同样受集群规模影响。
- 锁的一致性保证
- Zookeeper通过ZAB协议保证数据一致性,采用过半写成功策略。在获取和释放锁过程中,能保证较高的一致性,即所有客户端看到的锁状态是一致的,不会出现像Redis集群模式下因同步延迟导致的短暂不一致问题。
- 集群扩展时的处理机制
- 新增节点时,Zookeeper集群通过选举机制将新节点融入集群。由于Zookeeper的数据一致性机制,新节点加入对锁的获取和释放逻辑影响较小,只要新节点能成功参与集群的投票和数据同步,锁服务就能正常运行,可扩展性较好。
基于etcd的分布式锁
- 锁的获取与释放性能
- 获取性能:etcd基于Raft一致性算法,写操作需多数节点确认,获取锁时创建键值对操作性能相对Redis单节点获取锁会低一些,但etcd优化了存储和网络通信,实际性能在可接受范围。
- 释放性能:释放锁删除键值对操作,同样需多数节点确认,性能也会受集群规模影响,但整体性能与获取锁操作相近。
- 锁的一致性保证
- etcd的Raft算法保证了数据的强一致性,在锁的获取和释放过程中,所有节点数据状态保持一致,能有效避免锁的不一致问题,与Zookeeper类似,一致性保证优于Redis集群模式。
- 集群扩展时的处理机制
- 扩展时新增节点加入etcd集群,通过Raft协议同步数据。由于Raft算法的特性,新节点加入对锁的获取和释放逻辑影响不大,只要新节点能成功同步数据,锁服务能稳定运行,可扩展性良好。