李锋镝的博客

  • 首页
  • 时间轴
  • 留言
  • 插件
  • 左邻右舍
  • 关于我
    • 关于我
    • 另一个网站
  • 知识库
  • 赞助
Destiny
自是人生长恨水长东
  1. 首页
  2. 原创
  3. 正文

浅谈一下redis分布式锁和zookeeper分布式锁的区别以及各自的优缺点

2025年2月16日 235点热度 0人点赞 0条评论

区别

实现原理

  • Redis 分布式锁:主要基于 Redis 的原子操作。常见的是使用 SETNX(SET if Not eXists)命令或者 SET 命令的扩展参数(如 NX、EX)来实现。当一个客户端成功设置锁对应的键值时,就表示获取到了锁;释放锁则是删除对应的键。为了防止死锁,通常会给锁设置一个过期时间。
  • ZooKeeper 分布式锁:基于 ZooKeeper 的临时顺序节点和 Watcher 机制。客户端在 ZooKeeper 的特定节点下创建一个临时顺序节点,然后获取该节点下所有子节点的列表,判断自己创建的节点是否是序号最小的节点,如果是则表示获取到了锁;若不是则对前一个节点设置 Watcher 监听,当该节点被删除时,当前客户端会收到通知,再次检查自己是否成为最小节点以尝试获取锁。

锁的释放机制

  • Redis 分布式锁:通常需要客户端主动删除锁对应的键来释放锁。如果客户端在持有锁期间崩溃,通过设置的过期时间可以自动释放锁,避免死锁。
  • ZooKeeper 分布式锁:由于使用的是临时节点,当客户端会话结束(如客户端崩溃或网络断开),对应的临时节点会自动删除,从而实现锁的自动释放。

性能

  • Redis 分布式锁:性能较高,因为 Redis 是基于内存的单线程操作,读写速度非常快,加锁和解锁的操作延迟较低,适合对性能要求较高、并发量较大的场景。
  • ZooKeeper 分布式锁:性能相对较低,因为 ZooKeeper 是基于分布式协调服务,涉及到节点的创建、删除和 Watcher 机制,会有一定的网络开销和处理延迟,不过对于并发量不是特别大的场景,其性能也是可以接受的。

可靠性

  • Redis 分布式锁:在单点 Redis 情况下,如果 Redis 节点故障,可能会导致锁机制失效。虽然可以通过 Redis 集群(如 Redis Sentinel 或 Redis Cluster)来提高可靠性,但在主从切换等情况下,可能会出现短暂的锁丢失问题。
  • ZooKeeper 分布式锁:可靠性较高,ZooKeeper 本身是一个分布式协调服务,采用了 Zab 协议保证数据的一致性和高可用性。只要半数以上的节点正常工作,就能保证锁机制的正常运行,不会因为个别节点故障而导致锁失效。

优缺点

Redis 分布式锁

  • 优点
    • 高性能:基于内存操作,响应速度快,能够支持高并发场景下的锁操作。
    • 简单易用:实现方式相对简单,只需要使用 Redis 的基本命令即可,对开发者的技术要求较低。
    • 灵活性高:可以通过设置不同的过期时间来满足不同业务场景的需求,避免死锁的发生。
  • 缺点
    • 可靠性问题:在 Redis 集群环境下,存在主从切换时锁丢失的风险。
    • 锁的粒度控制有限:主要基于键值对来实现锁,对于复杂的锁粒度控制(如读写锁、可重入锁等)实现起来相对复杂。

ZooKeeper 分布式锁

  • 优点
    • 高可靠性:采用分布式协调服务,具备良好的数据一致性和高可用性,能够保证锁机制在节点故障时依然正常工作。
    • 锁的特性丰富:可以方便地实现公平锁、可重入锁等复杂的锁特性,满足不同业务场景的需求。
    • 自动释放锁:使用临时节点,客户端会话结束时锁会自动释放,避免了死锁的问题。
  • 缺点
    • 性能较低:由于涉及到节点的创建、删除和 Watcher 机制,会带来一定的网络开销和处理延迟,不适合对性能要求极高的场景。
    • 部署和维护复杂:ZooKeeper 是一个分布式系统,需要部署多个节点组成集群,部署和维护的成本相对较高。
除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.lifengdi.com/archives/article/4180

相关文章

  • SpringBoot 实现接口防刷的 5 种实现方案
  • 部署consul配置中心
  • Java设计支持千万级别的短链
  • 共识算法之Paxos 协议
  • 结合Apollo配置中心实现日志级别动态配置
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: 分布式 锁
最后更新:2025年2月16日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >

文章评论

1 2 3 4 5 6 7 8 9 11 12 13 14 15 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 48 49 50 51 52 53 54 55 57 58 60 61 62 63 64 65 66 67 69 72 74 76 77 78 79 80 81 82 85 86 87 90 92 93 94 95 96 97 98 99
取消回复

春宵一刻值千金,花有清香月有阴。
歌管楼台声细细,秋千院落夜沉沉。

最新 热点 随机
最新 热点 随机
SpringBoot框架自动配置之spring.factories和AutoConfiguration.imports 应用型负载均衡(ALB)和网络型负载均衡(NLB)区别 什么是Helm? TransmittableThreadLocal介绍与使用 ReentrantLock深度解析 RedisTemplate和Redisson的区别
玩博客的人是不是越来越少了?准备入手个亚太的ECS,友友们有什么建议吗?什么是Helm?2024年11月1号 农历十月初一别再背线程池的七大参数了,现在面试官都这么问URL地址末尾加不加“/”有什么区别
分布式、多线程、高并发概念与区别 JAVA之从线程安全说到锁 玩博客的人是不是越来越少了? 如何提升微服务的幸福感 推荐一款比较养眼的Xshell配色方案 使用Spring MVC的websocket配置时 Tomcat启动报错
标签聚合
教程 设计模式 SQL Spring 数据库 IDEA K8s MySQL SpringBoot docker 架构 分布式 JVM Redis 多线程 JAVA 日常 面试 文学 ElasticSearch
友情链接
  • i架构
  • 临窗旋墨
  • 博友圈
  • 博客录
  • 博客星球
  • 哥斯拉
  • 志文工作室
  • 搬砖日记
  • 旋律的博客
  • 旧时繁华
  • 林羽凡
  • 知向前端
  • 蜗牛工作室
  • 集博栈
  • 韩小韩博客
  • 風の声音

COPYRIGHT © 2025 lifengdi.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Dylan

津ICP备2024022503号-3