一、Redis 分布式锁:追求极致的性能

Redis 分布式锁基于内存操作,其核心思想是在内存中设置一个唯一的键值对来表示锁的持有。

1. 基础实现(SETNX + Lua)

最简单的实现是使用 SETNX(SET if Not eXists)命令:
加锁:设置一个键,值为随机值,并设置过期时间(防止死锁)
SET lock_resource_name my_random_value NX PX 30000

#解锁:使用Lua脚本保证原子性(检查值再删除)
if redis.call(“get”, KEYS[1]) == ARGV[1] then
return redis.call(“del”, KEYS[1])
else
return 0
end

2. 生产环境推荐(Redisson框架)

在实际生产中,强烈推荐使用 Java 的 Redisson 库,它解决了基础实现的诸多痛点:

• 看门狗机制(Watchdog):异步续期线程,在业务执行期间自动为锁续期,避免业务未完成而锁自动过期的问题。

• 可重入锁:支持同一线程多次加锁。

• Lua脚本原子性:所有操作都使用Lua脚本,保证原子性。
// Redisson 示例
RLock lock = redissonClient.getLock(“myLock”);
try {
lock.lock();
// … 执行业务逻辑
} finally {
lock.unlock();
}

3. Redis锁的优势与劣势

• 优势:

  • 性能极高:基于内存操作,吞吐量大,延迟低,适用于高并发场景(如秒杀)。

  • 实现简单:API 直观易懂,部署方便。

  • 功能丰富:通过 Redisson 支持多种锁类型(可重入、公平、读写锁)。

• 劣势:

  • 一致性依赖:在 Redis 主从异步复制架构下,如果主节点宕机且锁信息未同步到从节点,可能导致锁失效,出现多个客户端同时持有锁的情况(尽管 Redlock 算法试图解决此问题,但仍有争议)。

  • 非强一致性:本质上是 AP 系统,优先保证可用性,在网络分区时可能牺牲一致性。

二、ZooKeeper 分布式锁:追求绝对的可靠

ZooKeeper 是一个分布式协调服务,其分布式锁基于 临时顺序节点 和 Watch 机制,实现了强一致性。

1. 核心实现(临时顺序节点 + Watch)

• 加锁:所有客户端在同一个锁目录(如 /locks/mylock)下创建临时顺序节点。

• 排队:客户端获取目录下所有子节点,判断自己创建的节点是否为序号最小的。

• 监听:如果不是最小的,客户端只需监听(Watch)比自己序号小的前一个节点的删除事件,而无需监听所有节点。

• 解锁:当前一个节点被删除(即锁被释放)时,ZooKeeper 会精准通知下一个客户端,使其获得锁。

2. 生产环境推荐(Curator框架)

Apache Curator 库封装了 ZooKeeper 的复杂逻辑,提供了开箱即用的分布式锁。
// Curator 示例
InterProcessMutex lock = new InterProcessMutex(client, “/locks/mylock”);
try {
if (lock.acquire(10, TimeUnit.SECONDS)) {
// … 执行业务逻辑
}
} finally {
lock.release();
}

  1. ZooKeeper锁的优势与劣势

• 优势:

• 强一致性(CP):基于 ZAB 协议,数据在集群内强一致,锁模型非常可靠,不会出现脑裂导致的双重加锁。

• 自动释放:锁与客户端 Session 绑定,如果客户端宕机,其创建的临时节点会自动删除,锁也随之释放,有效避免了死锁。

• 公平锁:节点顺序生成,天然实现了公平的先来后到机制。

• 无惊群效应:通过 Watch 机制精准通知下一个等待者,避免了同时争抢。

• 劣势:

• 性能较低:每次加解锁都需要创建、删除节点,涉及网络通信和磁盘写入(日志),性能远低于 Redis。

• 运维复杂:需要额外维护一个 ZooKeeper 集群,增加了系统复杂度。

三、核心差异对比一览表

特性维度 Redis 分布式锁 ZooKeeper 分布式锁

一致性模型 最终一致性 (AP) 强一致性 (CP)

性能 高 (内存操作) 低 (需持久化日志)

可靠性 依赖配置和算法 (如 Redlock) 高 (基于 ZAB 协议)

锁释放 依赖超时 (手动或看门狗) 自动释放 (临时节点)

锁类型 非公平锁 (可配置公平锁) 公平锁 (顺序节点)

惊群效应 可能发生 可避免 (精准Watch)

运维成本 低 (通常已有Redis) 高 (需维护ZK集群)

四、选型建议:如何选择?

选择没有绝对的对错,只有适合与否。

选择 Redis 锁的场景:

• 高并发、高性能需求是首要目标(如秒杀、抢购、缓存击穿)。

• 可以接受极小概率下的锁失效(如业务逻辑有幂等性等补偿措施)。

• 系统已经部署了 Redis,希望减少外部依赖。

选择 ZooKeeper 锁的场景:

• 绝对可靠比性能更重要(如金融交易、核心账务、主备选举)。

• 锁持有时间较长的业务流程,不希望引入复杂的超时和续期机制。

• 系统已经依赖 ZooKeeper 做其他协调服务(如配置中心、服务发现)。

一言以蔽之:追求极致性能用 Redis,追求绝对可靠用 ZooKeeper。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/96243.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96243.shtml
英文地址,请注明出处:http://en.pswp.cn/web/96243.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue基于Springboot框架的考研咨询平台系统实现

目录前言-本系统介绍已开发项目效果实现截图开发技术详细介绍核心代码参考示例1.建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码获取详细视频演示或者查看其他版本:文章底部获取博主联系方式&…

苹果用户速更新!macOS存严重漏洞,用户隐私数据面临泄露风险

漏洞概况近日,macOS系统发现一个CVSS评分高达 9.8 的高危漏洞,该漏洞可能允许应用程序绕过系统保护机制,非法访问受保护的用户数据。该漏洞编号为 CVE-2025-24204,目前已有概念验证(PoC)代码公开。漏洞影响…

海盗王64位dx9客户端修改篇之五

在海盗王3.0客户都升级64位dx9版本的过程中,因为特效的问题,被卡壳了很久。 开始是精灵草的粒子效果、白银城的烟囱烟雾效果、篝火的效果、阳光透射效果、海浪效果等,修了很长的时间,才找到窍门弄好。 然后是精灵效果、角色阴影。…

Linux学习——管理网络安全(二十一)

一、管理服务器防火墙(firewalld)RHEL 默认使用 firewalld 作为防火墙管理工具,它通过 “区域(zone)” 和 “服务(service)” 的概念简化规则配置,支持动态更新规则而无需重启服务。…

leetcode-python-1941检查是否所有字符出现次数相同

题目: 给你一个字符串 s ,如果 s 是一个 好 字符串,请你返回 true ,否则请返回 false 。 如果 s 中出现过的 所有 字符的出现次数 相同 ,那么我们称字符串 s 是 好 字符串。 示例 1: 输入:s “…

Snort的介绍

当然可以。以下是对 Snort 的全面介绍,涵盖其定义、核心功能、三种运行模式、工作原理、规则系统以及应用场景等内容。 Snort 网络入侵检测系统(NIDS)详解 一、Snort 简介 Snort 是一款开源的、轻量级但功能强大的 网络入侵检测与防御系统&…

滴滴二面准备(一)

结合你的简历内容和技术面试问题,以下是一个结构化的回答建议,突出你的技术深度和项目经验:2. 项目与实习经历 得物低代码落地页编辑器(核心项目) 背景:解决软广落地页开发周期长、迭代慢问题。技术方案&am…

socket通信在Windows和Linux上的区别

前言 笔者在将socket通信的自定义类从Linux移植到Windows时遇到一些问题&#xff0c;整理下来希望帮助到需要的人&#xff0c;同时也加深自己的理解。 差异 头文件 #ifdef _WIN32 #include <ws2tcpip.h> #define inet_pton InetPton #define SHUT_RDWR SD_BOTH #define M…

一款将PDF转化为机器可读格式的工具介绍

ps:以下内容来自MinerU项目 MinerU 项目简介 MinerU是一款将PDF转化为机器可读格式的工具&#xff08;如markdown、json&#xff09;&#xff0c;可以很方便地抽取为任意格式。 MinerU诞生于书生-浦语的预训练过程中&#xff0c;我们将会集中精力解决科技文献中的符号转化问…

代码随想录算法训练营第三十九天|62.不同路径 63.不同路径ll

62.不同路径&#xff1a; 文档讲解&#xff1a;代码随想录|62.不同路径 视频讲解&#xff1a;https://www.bilibili.com/video/BV1ve4y1x7Eu 状态&#xff1a;已做出 一、题目要求&#xff1a; 一个二维数组里&#xff0c;将(0&#xff0c;0)位置下标作为起点&#xff0c;计算…

openEuler2403安装部署Prometheus和Grafana

文章目录openEuler2403安装部署Prometheus和Grafana一、前言1.简介2.环境二、正文1.环境准备1&#xff09;JDK 安装部署&#xff08;可选&#xff09;2&#xff09;关闭防火墙2.安装 Prometheus1&#xff09;下载和安装2&#xff09;启动3&#xff09;systemd服务管理3.安装 Gr…

乐吾乐大屏可视化组态软件【SQL数据源】

乐吾乐大屏可视化组态软件&#xff08;大屏可视化设计器 - 乐吾乐Le5le&#xff09;支持直接对接SQL数据源功能&#xff0c;目前仅对企业源码客户开放。 配置SQL数据源 管理员进入可视化管理中心&#xff0c;点击SQL数据源&#xff0c;配置添加SQL数据源。 创建SQL数据源连接 …

Django高效查询:values_list实战详解

Django 实战案例 讲解 values_list 的用法。 values_list("field", flatTrue) → 获取单字段的一维列表。values_list("f1", "f2") → 获取多个字段&#xff0c;返回元组。搭配 filter / distinct / in / 外键查询 非常高效。适合用于 导出数据 …

Java数据结构——树

一、树型结构1.1 概念我们之前提到的数组&#xff0c;单链表&#xff0c;栈和队列都是一种线性结构&#xff0c;每个元素都有最多一个后继节点。而树型结构是一种非线性结构&#xff0c;它是由n&#xff08;n>0&#xff09;节点组成的一个具有层次关系的集合。它之所以叫做树…

基于LLM的月全食时空建模与智能预测:从天文现象到深度学习融合

当古老的天文学遇上现代人工智能,会碰撞出怎样的火花? 一、当月球遇见AI 月全食,这一令人惊叹的天文现象,自古以来就吸引着无数天文学家和爱好者的目光。当地球恰好运行到太阳和月球之间,完全遮挡太阳光时,我们就能目睹月球逐渐被"吞噬"然后又重焕光彩的奇妙…

LeetCode热题 42.接雨水

题目 思路&#xff1a; 通过画图观察我们其实可以很容易发现&#xff0c;每个柱子接多少水由这个地方左边最高的柱子和右边最高的柱子确定&#xff0c;因为总要形成一个坑嘛&#xff0c;然后就能接着确定&#xff1a; 当前柱子接水量 min(左边最高柱子的高度, 右边最高柱子的…

PostgreSQL与Greenplum数据库的编程语言连接

编程语言连接数据库 目前数据库一般支持HA的连接&#xff0c;即一个Coordinator内的一个节点异常后会链接到另外的一个节点&#xff0c;不会影响业务的正常运行。在JDBC配置时需要采用 高可用链接字符串(Connection URL/DSN) 的方式连接。适用于不同的编程语言中使用&#xff…

后端(JDBC)学习笔记(CLASS 1):基础篇(一)

一、引言1、数据的存储开发java程序的时候&#xff0c;数据都是存储在内存中&#xff0c;属于临时存储&#xff0c;当程序停止或重启时&#xff0c;内存中的数据就丢失了。为了解决数据的长期存储问题&#xff0c;有如下解决方案&#xff1a;1、数据通过I/O流技术&#xff0c;存…

卷对卷(Roll-to-Roll,R2R)技术的应用领域和技术进展

目录&#xff1a;第一节&#xff1a;卷对卷技术及其应用领域和工艺要求一、卷对卷技术发展现概述二、卷对卷研发和规模化应用难点重点和发展趋势三、卷对卷工艺主要应用领域及工艺要求第二节&#xff1a;卷对卷生产工艺参数及质量控制四、卷对卷生产工艺控制参数和条件五、卷对…

【Ansible】管理变量和事实知识点

1.Ansible变量名由什么组成&#xff1f;答&#xff1a;变量名必须以字母开头&#xff0c;且只能含有字母、数字和下划线。2.定义变量的方法及变量的优先级&#xff1f;答&#xff1a;按优先级从低到高排列: 在清单中定义的组变量 < 在清单或playbook所在目录的group_vars子目…