分布式锁简介

  1. 产生背景
    服务器集群模式下需要对临界资源实现互斥访问
  2. 实现方案
    • 基于数据库
      使用唯一索引或排他锁来实现。
      缺点是IO限制导致的性能较差,同时支持功能太少,需要额外开发锁超时、锁失效等功能。
    • 基于KV缓存
      一般通过redis来实现。
      一种是单机方案,即通过单个redis实例,set key value ex/px timeout nx语句实现加锁,通过lua脚本比较key和value实现解锁,通过watchDog看门狗来实现业务运行时间超过"锁超时时间"时的续期,该方案问题在于单点故障问题;
      另一种是哨兵模式方案, 通过引入主从架构和哨兵机制,提升了系统的鲁棒性,但仍然会有主从切换时分布式锁可能被同时获取、以及由于网络原因导致的"脑裂"(多个master节点)等问题;
      第三种是RedLock方案,通过多个并列的redis实例提升系统的鲁棒性,加锁时需要对每个redis实例都加锁,只有超过一半的实例都加锁成功才算加锁成功。这种方案极大恶化了性能,同时在一些边界情况如某个redis实例中的锁过期时客户端在GC导致仍然在使用锁等场景仍然有问题
    • 基于一致性协议
      一般通过zookeeper实现,主要借助临时有序节点和watcher机制,客户端在获取锁时,会在zookeeper中创建一个临时有序节点(先创建的节点序号更小,优先级更高),序号最小的节点能获取到锁,同时通过watcher机制观察节点状态,当客户端解锁时,对应的临时有序节点会在zookeeper中注销,watcher观察到节点注销后,会通知下一个序号最小的节点获取到锁。
      zookeeper是鲁棒性最强的方案,但是在一些极边界情况下,仍然有问题,比如客户端网络异常会导致对应临时有序节点被注销,这样就会有新的客户端能拿到锁,可能就造成了锁被同时持有。
  3. 方案选型
    • 对性能没要求,对分布式锁的功能需求也极简单,可以考虑数据库方案,但一般不建议。
    • 对性能要求高,允许极端情况容错,可以采用Redis的方案。
    • 对性能要求较高,同时对一致性要求相当严格,可以采用zookeeper的方案。
相关推荐
恋喵大鲤鱼1 天前
MySQL 某个表字段实现分布式锁
mysql·分布式锁
__土块__3 天前
一次电商秒杀系统架构评审:从本地锁到分布式锁的演进与取舍
java·redis·高并发·分布式锁·redisson·架构设计·秒杀系统
better_liang4 天前
每日Java面试场景题知识点之-Redisson热门使用场景
java·redis·微服务·分布式锁·redisson·分布式系统
better_liang5 天前
每日Java面试场景题知识点之-Redisson核心价值与优化点详解
java·redis·分布式锁·redisson·微服务架构·分布式系统·缓存优化
星辰_mya22 天前
ZooKeeper 分布式锁:强一致性下的“排队”哲学
分布式·zookeeper·云原生·面试·分布式锁
尽兴-22 天前
大厂生产级 Redis 分布式锁:从原理到避坑实战
数据库·redis·分布式·分布式锁·setnx
笨手笨脚の1 个月前
Java 性能优化
java·jvm·数据库·性能优化·分布式锁·分布式事务·并发容器
wuxinyan1231 个月前
Java面试题040:一文深入了解分布式锁
java·面试·分布式锁
知识即是力量ol2 个月前
口语八股——Redis 面试实战指南(二):缓存篇、分布式锁篇
java·redis·缓存·面试·分布式锁·八股
少许极端2 个月前
Redis入门指南(八):从零到分布式缓存-集群机制、缓存机制、分布式锁
redis·分布式·缓存·分布式锁