分布式锁的实现

目录

      • 一、基于数据库的实现
        • 1. 悲观锁(行锁)
        • 2. 乐观锁(版本号)
      • 二、基于 Redis 的实现
        • 1. 单节点 Redis 锁
        • 2. Redlock 算法
      • 三、基于 ZooKeeper 的实现
      • 四、基于 Etcd 的实现
      • 五、其他实现
      • 对比表格
      • 选型建议

分布式锁是分布式系统中协调多节点并发访问共享资源的机制,其核心目标是保证在分布式环境下同一时刻只有一个客户端能执行关键操作。以下是常见的实现方式及其原理、优缺点和适用场景:


一、基于数据库的实现

1. 悲观锁(行锁)
  • 原理:通过数据库的行锁机制(如 SELECT ... FOR UPDATE)锁定记录。
  • 优点:实现简单,直接利用数据库特性。
  • 缺点
    • 性能差,高并发下数据库压力大。
    • 锁释放依赖数据库连接,可能因连接断开导致死锁。
  • 场景:低并发或已有数据库依赖的场景。
2. 乐观锁(版本号)
  • 原理:在数据表中增加版本号字段,更新时校验版本号。
  • 优点:无锁竞争,适合读多写少场景。
  • 缺点:需自旋重试,可能增加业务复杂度。
  • 场景:冲突较少的长事务场景。

二、基于 Redis 的实现

1. 单节点 Redis 锁
  • 原理:使用 SET key value NX EX 命令设置带过期时间的键。
  • 优点:性能高(10万+ QPS),实现简单。
  • 缺点
    • 单点故障可能导致锁失效。
    • 过期时间难以精确设置(如业务未完成锁已过期)。
  • 改进:通过 Lua 脚本保证原子性,或使用 Redlock 算法。
2. Redlock 算法
  • 原理:向多个独立 Redis 节点依次申请锁,多数节点获取成功才算获得锁。
  • 优点:提升可用性,降低单点风险。
  • 缺点
    • 部署复杂,需多个 Redis 实例。
    • 性能下降(需多节点通信)。
  • 场景:对一致性要求较高的场景(如金融系统)。

三、基于 ZooKeeper 的实现

  • 原理
    1. 创建临时有序节点(如 /lock/resource_00000001)。
    2. 检查自己是否为最小节点,是则获得锁。
    3. 否则监听前一个节点的删除事件。
  • 优点
    • 高可靠性(CP 系统,强一致性)。
    • 自动释放(连接断开时节点自动删除)。
  • 缺点
    • 性能较低(万级 QPS)。
    • 需维护 ZK 集群,复杂度高。
  • 场景:对一致性要求极高的场景(如配置管理)。

四、基于 Etcd 的实现

  • 原理:利用 Etcd 的租约(Lease)和事务(TXN)机制:
    1. 创建租约并绑定临时键值对。
    2. 通过事务比较版本号竞争锁。
  • 优点
    • 高可用(基于 Raft 协议)。
    • 支持自动续期和公平锁。
  • 缺点:学习成本高,需熟悉 Etcd API。
  • 场景:Kubernetes 生态或需要强一致性的系统。

五、其他实现

  • Consul:通过 Session 机制和 Key-Value 存储实现锁。
  • Chubby:Google 内部的分布式锁服务(类似 ZooKeeper 但更强调高可用)。

对比表格

实现方式性能一致性可用性复杂度适用场景
数据库行锁低并发,已有数据库依赖
Redis 单节点极高高并发,允许偶发锁失效
Redis Redlock较强高并发,需更高可靠性
ZooKeeper强一致性,低频写操作
Etcd中高云原生环境,强一致性需求

选型建议

  1. 一致性要求:强一致性选 ZooKeeper/Etcd,弱一致性选 Redis。
  2. 性能需求:高并发选 Redis,低频高可靠选 ZooKeeper。
  3. 运维成本:数据库方案简单,但 Redis/Etcd/ZK 需额外维护集群。
  4. 生态集成:Kubernetes 环境优先考虑 Etcd,大数据生态可选 ZooKeeper。

实际应用中需结合 CAP 权衡,例如 Redis 侧重 AP,ZooKeeper/Etcd 侧重 CP。同时建议结合具体客户端库(如 Redisson、Curator)简化开发。

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

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

相关文章

C++模版(进阶)

文章目录 一、非类型模版参数二、模版的特化2.1 概念2.2 函数模版特化2.2.1 函数模版特化为指针类型注意事项 2.3 类模版特化2.3.1 全特化2.3.2 偏特化(半特化)2.3.3 类模板特化应用示例 三、模版分离编译3.1 什么是分离编译?3.2 模版的分离编译3.3 解决方法! 四、模…

Linux配置yum仓库,服务控制,防火墙

一、yum仓库 1.在安装软件时,首先第一步就是要考虑软件的版本的问题! 2.软件的安装:最安全可靠的方法就是去软件对应的官网上查看安装手册(包括的软件的下载) 红帽系软件安装的常见的3种方式 (1&#x…

布谷直播系统源码开发实战:从架构设计到性能优化

作为山东布谷科技的一名技术研发人员,我参与了多个直播系统平台从0到1的开发和搭建,也见证了直播行业从萌芽到爆发的全过程。今天,我想从研发角度,分享一些直播系统软件开发的经验和心得,希望能对大家有所帮助。 一、 …

实战设计模式之解释器模式

概述 作为一种行为设计模式,解释器模式提供了一种方法来定义语言的文法规则,并通过这些规则解析和处理特定类型的语言句子。简单来说,解释器模式允许我们定义一个代表某种语言中语法规则的对象结构,从而能够根据这些规则理解并处理…

物联网边缘计算网关是什么?

在物联网的浩瀚架构中,边缘计算网关宛如一位坚毅的前沿哨兵,默默守护着数据处理与传输的关键防线,为整个物联网系统的高效运转发挥着不可或缺的作用。 一、边缘计算网关的定义与基本功能 边缘计算网关是一种智能设备,它被部署在…

计算机视觉算法实战——障碍物识别(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​ ​​​​​​ ​ ​ 1. 引言 计算机视觉是人工智能领域的一个重要分支,旨在通过计算机模拟人类的视觉系统,从…

Win11锁屏后显示“天气、市场、广告”如何取消显示

关闭方法:设置>个性化>锁屏界面>锁屏界面状态>"无"。 方法一:通过“个性化”设置 打开“设置”应用: 点击屏幕左下角的“开始”按钮(Windows 图标)。点击齿轮状的“设置”图标。或者按下 Win I…

10天速通强化学习-008

TRPO 思考-TRPO-在线策略-给定信任区域防止更新不稳定 Actor-Critic网络随着网络深度的增加,步长太长,梯度更新会变差。改变方法-增加信任区域。(trust region policy optimization)-TRPO算法: 核心思想: 是在每次迭代中&…

整合百款经典街机游戏的模拟器介绍

对于80、90后而言,街机游戏承载着童年的欢乐记忆。今天要给大家介绍一款超棒的软件——「MXui街机厅经典游戏101款」,它能带你重回那段热血沸腾的街机时光。 「MXui街机厅经典游戏101款」是一款绿色免安装的街机模拟器,体积约1.39G。无需繁琐…

springboot第三站(1) web开发引入

目录 1.简介 2.SpringBoot对静态资源的映射规则 3.模版引擎 1.简介 使用SpringBoot; 1)、创建SpringBoot应用,选中我们需要的模块; 2)、SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定…

12-二叉树-二叉树高度(给定前序和中序确定二叉树)

题目 来源 23. 二叉树的高度 思路 其实跟09那篇很像,反正核心就是要通过前序和中序来建树,只不过现在多了一个返回值;因为建树的时候,其实左子树和右子树的深度就可以知道。其余详见代码。 代码 /* 前序遍历根左右,中序&…

PSI5接口

文章目录 前言PSI5接口简介操作模式命名规则异步操作模式(PSI5-A)同步操作模式(PSI5-P) 传感器->ECU物理层(位编码)数据链路层数据帧帧格式串行消息帧10bits 传感器帧定义超10bits传感器帧定义 ECU->…

垃圾处理全流程监管平台

在当前城市化进程中,垃圾处理已成为城市管理的重要课题。随着技术的发展,垃圾处理全流程监管平台的建设显得尤为重要。该平台能够实现垃圾从产生、收集、运输到最终处理的全流程监管,提高垃圾处理效率,促进资源回收利用&#xff0…

【Linux编程】IPC之消息队列从踩坑到实战:核心原理、实战案例与C++封装详解(含完整代码)

一、消息队列基础概念 消息队列是Linux系统提供的一种进程间通信(IPC)机制,具有以下特点: 消息以链表形式存放在内核中每个消息包含类型标识(mtype)支持多生产者/多消费者模式消息总长度受限于系统配置&a…

Unity 项目工程结构目录

1. Unity.VisualScripting.Core 作用: Visual Scripting 的核心模块,提供了可视化编程的基础功能(前身为 Bolt)。它允许开发者通过节点图创建游戏逻辑,而无需编写代码。 典型用途: 非程序员快速构建原型,或简化…

从pdf提取文本数据的c/cpp库(非OCR)

Aspose.PDF for C 商业付费版,无源码。 功能强大,支持多种PDF操作。 对应的官方示例代码:Aspose.PDF-for-C Spire.PDF for C 商业付费版 对应的官方示例代码:Spire.PDF-for-C- PDFTron SDK 商业付费版 PoDoFo 开源 当前版本…

【Linux操作系统——学习笔记二】Linux简单导航命令操作

一、前言 学习Linux,本质上是学习在命令行下熟练使用Linux的各类命令。 命令行:是一种通过输入命令和参数与计算机系统进行交互的方式,可以使用各种字符化命令对系统发出操作指令,打开Linux终端,进入命令行界面。 …

赛逸展2025创新模式,以科技创新奖赋能展位战略价值

CES Asia2025第七届亚洲消费电子技术贸易展(赛逸展)主办方负责人提出的创新理念,为展会的战略价值注入了新活力:“我们不是在卖展位,而是在分发政策红利入场券——企业每平方米的展位投入,都可能通过科技创…

深度革命:ResNet 如何用 “残差连接“ 颠覆深度学习

一文快速了解 ResNet创新点 在深度学习的历史长河中,2015年或许是最具突破性的一年。这一年,微软亚洲研究院的何恺明团队带着名为ResNet(残差网络)的模型横空出世,在ImageNet图像分类竞赛中以3.57%的错误率夺冠&#…

将Django连接到mysql

将Django连接到mysql 文章目录 将Django连接到mysql一.按照我的文章 在Django模型中的Mysql安装 此篇 的步骤完成mysql的基础配置二.Django配置 一.按照我的文章 ‘在Django模型中的Mysql安装’ 此篇 的步骤完成mysql的基础配置 基础配置具体内容 1.打开PowerShell 安装mysql的…