当前位置: 首页 > backend >正文

详细说说Redis分布式锁和ZK分布式锁

在分布式系统中,分布式锁是实现资源互斥访问的核心机制。Redis 和 ZooKeeper(ZK)是两种常用的分布式锁实现方案,但它们的实现原理、优缺点和适用场景存在显著差异。


一、Redis 分布式锁

实现原理
  1. 基础命令

    • SET key value NX PX timeout(推荐方式):
      • NX:仅当键不存在时设置键值(保证互斥)。
      • PX:设置键的过期时间(避免死锁)。
    • 示例:SET lock:order123 "client1" NX PX 30000
      (客户端 client1 获取锁,锁自动释放时间为 30 秒)
  2. 释放锁

    • 必须通过 Lua 脚本原子性验证值后删除,防止误删其他客户端的锁:
      if redis.call("GET", KEYS[1]) == ARGV[1] thenreturn redis.call("DEL", KEYS[1])
      elsereturn 0
      end
      
  3. 高级方案

    • RedLock 算法(多节点 Redis 集群):
      • 客户端依次向多个 Redis 节点申请锁,超过半数成功则视为获取锁。
      • 争议点:时钟漂移、网络分区等问题可能影响正确性(社区存在争论)。
核心特性
  • AP 系统:Redis 优先保证可用性(Availability)和分区容忍性(Partition Tolerance),弱一致性。
  • 性能高:基于内存操作,适合高并发场景。
  • 锁自动释放:依赖过期时间,需合理设置避免业务未完成锁失效。
优点
  • 简单易用:API 直观,适合快速实现。
  • 高吞吐量:单节点 Redis 可支撑数万 TPS。
  • 容错性:通过 RedLock 降低单点故障风险(但有争议)。
缺点
  • 非强一致:主从异步复制可能导致锁丢失(故障转移时)。
  • 时钟依赖:过期时间依赖系统时钟,时钟漂移可能引发问题。
  • 误删风险:需严格通过 Lua 脚本保证原子性释放。

二、ZooKeeper 分布式锁

实现原理
  1. 临时顺序节点

    • 客户端在 ZK 的锁目录下创建临时顺序节点(如 /locks/lock_00000001)。
    • 临时性:客户端会话结束(如宕机)时节点自动删除,避免死锁。
    • 顺序性:节点按创建顺序编号,便于实现公平锁。
  2. 锁获取

    • 客户端检查自己是否是当前最小序号节点:
      • 如果是,获得锁。
      • 否则,监听前一个节点的删除事件(避免“羊群效应”)。
  3. 锁释放

    • 业务完成后主动删除节点,或会话超时后自动删除。
核心特性
  • CP 系统:ZooKeeper 优先保证一致性(Consistency)和分区容忍性(Partition Tolerance)。
  • 强一致性:通过 ZAB 协议保证数据一致性。
  • 公平锁:天然支持按顺序获取锁。
优点
  • 可靠性高:无锁超时问题,客户端宕机自动释放锁。
  • 无时钟依赖:锁的释放仅依赖会话状态。
  • 可监控:通过 Watcher 机制实现锁状态实时感知。
缺点
  • 性能较低:ZK 的写操作(如创建节点)需集群多数节点确认,吞吐量低于 Redis。
  • 实现复杂:需处理 Watcher 的触发和重连逻辑。
  • 网络敏感:频繁的 Watcher 通知可能引发性能问题。

三、关键对比

特性Redis 分布式锁ZooKeeper 分布式锁
一致性模型AP(最终一致)CP(强一致)
性能高吞吐量(内存操作)较低(需集群协调)
锁释放方式依赖过期时间(需合理设置)会话结束自动释放(无超时风险)
可靠性依赖 Redis 持久化和集群机制高(强一致性保证)
实现复杂度简单(基于 SETNX + Lua)复杂(需处理节点监听和回调)
适用场景高并发、允许短暂不一致强一致性、高可靠性要求
典型问题锁提前释放、脑裂问题羊群效应、会话管理

四、场景选择建议

  1. 选择 Redis

    • 高并发场景(如秒杀、库存扣减)。
    • 允许短暂锁失效(业务能处理重试或幂等)。
    • 对性能要求极高,可接受最终一致性。
  2. 选择 ZooKeeper

    • 需要强一致性(如金融交易、关键配置更新)。
    • 锁持有时间较长或不可预测(避免超时风险)。
    • 需要公平锁或可重入锁。

五、注意事项

  • Redis 锁的陷阱
    • 避免锁过期时间过短导致业务未完成锁被释放。
    • 推荐使用 Redisson 客户端(内置看门狗自动续期)。
  • ZK 锁的优化
    • 使用临时顺序节点避免羊群效应。
    • 合理设置会话超时时间(sessionTimeout)。

🐮👵

  • Redis 分布式锁:轻量级、高性能,适合对一致性要求不高的高频场景。
  • ZooKeeper 分布式锁:强一致、高可靠,适合关键业务场景,但需容忍较低性能。

你想要的我全都有:https://pan.q删掉憨子uark.cn/s/75a5a07b45a2

在这里插入图片描述

http://www.xdnf.cn/news/9795.html

相关文章:

  • 动手学深度学习pytorch学习笔记 —— 第四章(2)
  • 2023年6级第一套长篇阅读
  • Mybatis中的懒加载
  • 高密爆炸警钟长鸣:AI为化工安全戴上“智能护盾”
  • 基于MATLAB实现SFA(Slow Feature Analysis,慢特征分析)算法
  • Java八股-Java优缺点,跨平台,jdk、jre、jvm关系,解释和编译
  • Java 微服务架构设计:服务拆分与服务发现的策略
  • 信息学奥赛一本通 1551:维护序列
  • 为什么在我的Flask里面有两个路由,但是在网页里有一个却不能正确访问到智能体
  • JDBC 核心执行流程详解
  • 如何在矩池云实例上开启应用服务的访问端口
  • 测试策略:AI模型接口的单元测试与稳定性测试
  • ADQ108-1通道8bit 6~7G USB2.0 PXIe cPCIe采集
  • 【大模型面试每日一题】Day 31:LoRA微调方法中低秩矩阵的秩r如何选取?
  • 解决matlab两个库文件名冲突的问题
  • 据传苹果将在WWDC上发布iOS 26 而不是iOS 19
  • 第一章 Linux的例行性工作(计划任务)
  • 大模型深度学习之双塔模型
  • 从 “金屋藏娇” 到 自然语言处理(NLP)
  • 汽车EPS系统的核心:驱动芯片的精准控制原理
  • 高校大数据采集平台产品特色
  • Linux系统管理与编程24:基础条件准备-混搭“本地+阿里云”yum源
  • 替代 WPS 的新思路?快速将 Word 转为图片 PDF
  • Spring Boot 集成 Elasticsearch怎样在不启动es的情况下正常启动服务
  • VR视角下,浙西南革命的热血重生​
  • 打卡day39
  • OpenCV CUDA模块结构分析与形状描述符------在 GPU 上计算图像的原始矩(spatial moments)函数spatialMoments()
  • Python自动化之selenium语句——元素点击、输入、清空和八大元素定位方法
  • 【保姆级教程】Windows部署LibreTV+cpolar实现远程影音库访问全步骤
  • PaddleOCR本地部署 (Python+Flask)