【业务功能篇72】分布式锁实现分析

分布式锁:场景和使用方法(通俗讲解) 对于锁大家肯定不会陌生,比如 synchronized 关键字 和 ReentrantLock 可重入锁,一般我们用其在多线程环境中控制对资源的并发访问。但是随着业务的发展,分布式的概念逐渐出现在我们系统中,我们在开发的过程中经常需要进行多个系统之间的交互,于是上面的加锁方法就会失去作用。于是在分布式锁就自然而然的诞生了,接下来我们来聊一聊分布式锁实现的几种方式。 阅读详情

什么是分布式锁?当多个进程在同一个系统中,用分布式锁控制多个进程对资源的访问

分布式锁应用场景 

(1)传统的单体应用单机部署情况下,可以使用java并发处理相关的API进行互斥控制。

(2)分布式系统后由于多线程,多进程分布在不同机器上,使单机部署情况下的并发控制锁策略失效,为了解决跨JVM互斥机制来控制共享资源的访问,这就是分布式锁的来源;分布式锁应用场景大都是高并发、大流量场景。

 1.基于Redisson对redis分布式锁实现 

 基于Redisson对redis分布式锁的实现;

(1)加锁机制:根据hash节点选择一个客户端执行lua脚本

(2)锁互斥机制:再来一个客户端执行同样的lua脚本会提示已经存在锁,然后进入循环一直尝试加锁

(3)可重入机制

(4)watch dog自动延期机制

(5)释放锁机制

 


2.基于ETCD实现分布式锁

1.Lease机制:租约机制(TTL,Time To Live),Etcd 可以为存储的 key-value 对设置租约,

当租约到期,key-value 将失效删除;同时也支持续约,通过客户端可以在租约到期之前续约,

以避免 key-value 对过期失效。Lease 机制可以保证分布式锁的安全性,为锁对应的 key 配置租约,

即使锁的持有者因故障而不能主动释放锁,锁也会因租约到期而自动释放

2.   Revision机制:每个 key 带有一个 Revision 号,每进行一次事务加一,它是全局唯一的,

通过 Revision 的大小就可以知道进行写操作的顺序。在实现分布式锁时,多个客户端同时抢锁,

根据 Revision 号大小依次获得锁,可以避免 “羊群效应” ,实现公平锁

3.  Prefix机制:即前缀机制。例如,一个名为 /etcdlock 的锁,两个争抢它的客户端进行写操作,

实际写入的 key 分别为:key1="/etcdlock/UUID1",key2="/etcdlock/UUID2",

其中,UUID 表示全局唯一的 ID,确保两个 key 的唯一性。写操作都会成功,但返回的 Revision 不一样,

那么,如何判断谁获得了锁呢?通过前缀 /etcdlock 查询,返回包含两个 key-value 对的的 KeyValue 列表,

同时也包含它们的 Revision,通过 Revision 大小,客户端可以判断自己是否获得锁

4.  Watch机制:即监听机制,Watch 机制支持 Watch 某个固定的 key,也支持 Watch 一个范围(前缀机制),

当被 Watch 的 key 或范围发生变化,客户端将收到通知;在实现分布式锁时,如果抢锁失败,

可通过 Prefix 机制返回的 KeyValue 列表获得 Revision 比自己小且相差最小的 key(称为 pre-key),

对 pre-key 进行监听,因为只有它释放锁,自己才能获得锁,如果 Watch 到 pre-key 的 DELETE 事件,

则说明 pre-key 已经释放,自己已经持有锁

基于ETCD分布式锁的实现流程

 1. 建立连接

客户端连接 Etcd,以 /etcd/lock 为前缀创建全局唯一的 key,

假设第一个客户端对应的 key="/etcd/lock/UUID1",第二个为 key="/etcd/lock/UUID2";

客户端分别为自己的 key 创建租约 - Lease,租约的长度根据业务耗时确定;

2: 创建定时任务作为租约的“心跳”

当一个客户端持有锁期间,其它客户端只能等待,为了避免等待期间租约失效,

客户端需创建一个定时任务作为“心跳”进行续约。此外,如果持有锁期间客户端崩溃,

心跳停止,key 将因租约到期而被删除,从而锁释放,避免死锁

3: 客户端将自己全局唯一的 key 写入 Etcd

执行 put 操作,将步骤 1 中创建的 key 绑定租约写入 Etcd,根据 Etcd 的 Revision 机制,

假设两个客户端 put 操作返回的 Revision 分别为 1、2,客户端需记录 Revision 用以

接下来判断自己是否获得锁

步骤 4: 客户端判断是否获得锁

客户端以前缀 /etcd/lock/ 读取 keyValue 列表,判断自己 key 的 Revision 是否为当前列表中

最小的,如果是则认为获得锁;否则监听列表中前一个 Revision 比自己小的 key 的删除事件,一旦监听到删除事件或者因租约失效而删除的事件,则自己获得锁。

步骤 5: 执行业务

获得锁后,操作共享资源,执行业务代码

步骤 6: 释放锁

完成业务流程后,删除对应的key释放锁


3.基于Zookeeper分布式锁的使用

流程类似ETCD:

1.启动客户端,确认链接到了服务器

2.多个客户端并发的在特定路径下创建临时性顺序节点

3.客户端判断自己的创建的顺序节点是否是最小的,如果是最小的,则获取锁成功

4.第三步若判定失败,则采用zk的watch机制监听自己的前一个顺序节点,等待前一个节点的删除(放锁)事件,再开始第三步判定。

zookeeper作为高性能分布式协调框架,可以把其看做一个文件系统,其中有节点的概念,并且分为4种:1.持久性节点2.持久性顺序节点3.临时性节点4.临时性顺序节点。

分布式锁的实现主要思路就是:监控其他客户端的状态,来判断自己是否可以获得锁。

采用临时性顺序节点的原因:

•1.zk服务器维护了客户端的会话有效性,当会话失效的时候,其会话所创建的临时性节点都会被删除,通过这一特点,可以通过watch临时节点来监控其他客户端的情况,方便自己做出相应动作。
•2.因为zk对写操作是顺序性的,所以并发创建的顺序节点会有一个唯一确定的序号,当前锁是公平锁的一种实现,所以依靠这种顺序性可以很好的解释—节点序列小的获取到锁

  并且可以采用watch自己的前一个节点来避免惊群现象(这样watch事件的传播是线性的)。

软件开发中的洼地思维:识别与治理系统隐性风险 在软件工程中,‘洼地’指代那些不直接产生业务价值、却持续消耗维护成本、加速系统熵增的隐性缺陷——如配置漂移、契约失配、日志不可追溯等。其本质是过程、架构与人协同失效的具象出口,遵循热力学式熵增规律,需通过可量化测绘、溃坝风险建模、防御式填埋及免疫机制构建实现系统级韧性提升。该理念超越传统技术债管理,强调将‘负空间’转化为架构演进探针和研发效能度量基准,广泛适用于微服务治理、研发质量体系建设与高可用系统设计等核心场景。 阅读详情

相关推荐

混合式项目管理:在敏捷与瀑布之间构建可控交付路径

软件项目管理中的‘混合式方法’并非简单拼凑敏捷与瀑布,而是针对需求模糊性与市场不确定性并存的现实场景,通过动态平衡控制力与灵活性来提升交付确定性。其核心原理在于分层治理——以瀑布思维锚定刚性契约(如合规、安全、性能基线),以敏捷机制响应变化(如双周迭代、快速反馈),再以工程化手段实现质量左移与信息管道化。这种模式显著降低返工率、缩短关键路径周期,并增强跨角色认知对齐,广泛适用于政务系统升级、金融风控、医疗SaaS等强约束型中大型交付项目。

weixin_30603633的博客 402

分布式锁应用场景/实现方案

分布式锁应用场景/实现方案

EverWHL的专栏 7354

初创公司云迁移的三大障碍:技术、组织与战略断层

云迁移对初创企业而言,远不止是基础设施替换,而是涉及架构演进、成本治理与组织协同的系统性工程。其核心在于理解云原生的本质——以自动化、可观测性与按需弹性为特征的新型交付范式。当团队陷入Kubernetes学习困境、IAM权限僵局或云账单失控时,问题往往不在工具本身,而在于缺乏基础设施即代码(IaC)、成本可视化与架构决策记录(ADR)等基础能力。这些能力共同构成云健康度的底层支撑,直接影响MVP上线效率、故障响应速度与融资阶段的技术可信度。本文聚焦startup在cloud journey中高频遭遇的obs

weixin_34337381的博客 423

分布式锁的应用场景和三种实现方式

多线程对同一资源的竞争,需要用到锁,例如Java自带的Synchronized、ReentrantLock。 但只能用于单机系统中,如果涉及到分布式环境(多机器)的资源竞争,则需要分布式锁。分布式锁的主要作用: 保证数据的正确性: 比如:秒杀的时候防止商品超卖,表单重复提交,接口幂等性。 避免重复处理数据: 比如:调度任务在多台机器重复执行,缓存过期所有请求都去加载数据库。分布式锁的主要特性: 互斥:同一时刻只能有一个线程获得锁。 可重入:当一个线程获取锁后,还可以再次获取这个锁,避免死锁发生。 高可用:当

分享 7305

深入学习 Redis - 分布式锁底层实现原理,以及实际应用

lua 语言特别轻量(实现一个 lua 解释器,消耗的体积非常小),可以使用 lua 编写一些逻辑,把这个脚本上传到 redis 服务器上,然后就可以让客户端来控制 redis 执行上述脚本了.最重要的一点就是,redis 执行一个 lua 脚本,就相当于在 redis 上执行一个命令一样,是原子的. 并且 redis 官方文档中也明确说,lua 就属于是 事务 的替代方案.例如前面的 “买票” 案例.elsereturn 0end;

CYK_byte的博客 6428

【信息科学与工程学】【数据中心】 第二十三篇 DDC网络-满足大规模训练、推理、存储区网络(Roce2组网)

特征维度具体特征网络影响设计考虑通信模式​集体通信为主(All-Reduce/All-Gather)多对多通信模式需要高带宽、低延迟的All-to-All连接流量模式​同步、周期性、模式可预测突发带宽需求高需要高效的拥塞控制和流量调度延迟敏感性​端到端延迟敏感(μs级)尾延迟影响训练时间需要无损网络、确定性延迟带宽需求​持续高带宽(100-400Gbps/节点)网络容量压力大需要高带宽、无阻塞网络扩展规模​数千到数万GPU节点可扩展性挑战需要层次化、模块化设计存储访问​大块顺序读写为主存储带宽需求高需要高带

weixin_49199313的博客 1880

随手记录4:spring上下文ApplicationContext 两种获取方式和使用获取普通对象和FactoryBean的不同;

随手记录4:spring上下文ApplicationContext 获取和使用;简介关于ApplicationContext 获取关于ApplicationContext 使用1.UserService .java2.FactoryBeanConfig .java结论 简介 项目中基本上好多对象都是交给spring管理的; 但是有些静态的工具类中想获取该对象又不能通过 @Autowired直接注入; 或者有些方法里面需要使用到spring托管的对象; 可以通过ApplicationContext 直接获

weixin_43812522的博客 744

STM32H7+LAN8720A之ETH与LWIP配置问题(End)

开篇介绍 由于项目中需要使用到STM32H7系列的芯片,且该系列无法移植ST的标准库,只能使用ST的HAL库,通过STM32Cube生成HAL库的基本代码。在项目开发中需要使用到STM32板载的ETH口,在简化的四层模型中充当着数据链路层的角色,我们只需添加PHY并配置好IP,即可实现基本的TCP主从机通信、UDP通信等等。 一、激光雷达3i-T1 由于使用了一款只具有网口通信的单线激光雷达,其具有TCP和UDP方式的通信方式,为了避免进行TCP中的socket报文解析和繁琐的通信握手过程,我们首先将雷达配

weixin_42024702的博客 1万+

如何在72小时内完成Open-AutoGLM对接上线?一线工程师亲述避坑指南

快速掌握Open-AutoGLM对接核心方法,解决美甲服务预约系统上线难题。一线工程师分享72小时内高效集成经验,涵盖自动化测试、接口联调与异常处理等关键环节,提升部署稳定性与开发效率。适用于本地化部署与SaaS场景,值得收藏。

SimTrans的博客 1026

Cadence电路原理图全部变成黄色如何解决?

Cadence电路原理图全部变成黄色如何解决?现象:解决方法: 最近用cadence仿真锁相环,拷贝师哥的library后打开,发现schematic中全部变成了黄色,但可以正常修改元件参数,正常仿真。仅仅影响使用效果,看起来超级难受。 现象: 1.电路元件及连线全部变为黄色 2.可以正常修改参数,电路ADE仿真 如下图所示: 解决方法: 重新导入display.drf文件,步骤如下: tool——Display Resource Manager,截图如下 完成上述步骤,显示如下界面,选择Merge选项

virtuoso~晓晓 1万+

基于物联网技术智慧园林绿化养护管理信息平台

近几年来,随着经济不断的发展,城市面积不断的扩大,城市管理中的园林绿化工作也在这种趋势下不断的发生着深刻改变。管养企业是否按制定的管养计划严格执行?绿化事件整改是否及时到位?绿地面积是否在稳步增长?管养的效果如何?如何客观评价管养企业的管养工作?这些都是我们各级管理者需要面对的问题。   智慧园林绿化养护管理信息平台的开发思路以“考核”为核心,整个信息平台体现出“新、快、高、全、享”五个特点。   智慧园林绿化养护管理信息平台的整个开发理念为:依托五大技术手段(全球卫星定位系统技术、地理信...

Cesium的博客QQ2252224326 2459

Plone可行性衰减分析:从企业级CMS到现代技术选型决策

内容管理系统(CMS)是数字基建的核心组件,其选型直接关系到开发效率、运维成本与业务响应速度。Plone作为基于Zope和ZODB的对象型CMS,曾以严谨的权限模型与内容安全机制著称,但其架构复杂性、Zope生态依赖及ZODB性能瓶颈,正导致实际项目中的人力成本激增与升级风险放大。随着Django和Wagtail等基于Python生态、遵循约定优于配置原则的框架普及,CMS技术价值重心已从‘功能完备性’转向‘交付可行性’——即能否在可控周期内完成开发、稳定运维并快速迭代。本文结合真实迁移案例与量化指标,解析

aoanping0730的博客 320

Howland电流源电路:从理论到实践的深度解析与优化策略

本文深度解析了Howland电流源电路的工作原理,从经典四电阻架构的“虚短”“虚断”分析,到其实现宽带恒流输出的理论优势。重点剖析了实践中因电阻精度、运放参数及PCB布局导致的性能瓶颈,并提供了引入第五电阻、优化运放选型等关键优化策略,旨在将输出阻抗从kΩ级提升至MΩ级,以满足精密测量与传感器驱动等应用需求。

weixin_29243063的博客 441

7/19-7/20:之前问到过的面试问题复习

7.20前的面试题复习

南清在coding的博客 272

Ubuntu 22.04 搭建 PX4 飞控系统完全指南:从仿真到硬件试飞

定义消息文件protobufuint64 timestamp # 时间戳float32 temperature # 温度float32 humidity # 湿度生成代码:bashPX4 在 Ubuntu 22.04 的搭建涉及环境配置、编译仿真、硬件连接等多环节,核心是理解 PX4 1.14 的新特性(uXRCE-DDS、动态控制分配)。通过本文指南,开发者可快速构建稳定的 PX4 开发环境,为无人机应用开发奠定基础。

zqmgx13291的博客 3039

c# 如何使用S7NET 读取汇川H5U的数据

本文介绍了两种使用C#读取汇川H5U PLC数据的方法。第一种通过ModbusTCP协议(推荐),使用NModbus库实现,步骤包括配置PLC的Modbus服务器功能、安装库及编写读取保持寄存器的代码。第二种针对兼容西门子S7协议的型号,使用S7NetPlus库直接读取。文章强调需注意地址映射关系、协议配置及网络设置,并建议优先采用ModbusTCP方案以确保稳定性。两种方法均提供了完整的代码示例,帮助开发者快速实现在C#环境下与汇川H5U PLC的通信。

StevenChen的博客 457

六本重塑工程管理认知的实战书单:从人治到系统设计

工程管理不是对人的管控,而是面向复杂软件系统的结构化设计。其核心原理在于通过降低反馈延迟、约束认知负荷、量化技术杠杆率,来对抗信息熵增与交付不确定性的天然矛盾。这类管理能力具有强工程属性——依赖可测量指标(如部署前置时间、变更失败率)、可验证契约(如API SLA、RFC流程)和可编程组织拓扑(如流对齐团队)。它支撑高韧性架构演进、跨职能协同提效与技术债科学治理,最终服务于业务价值的快速闭环验证。本文聚焦六本经实证检验的工程管理经典,揭示如何将抽象管理理念翻译为代码、日志、监控与架构图中的具体实践。

weixin_30652897的博客 754

面向高速Serdes的信号完整性优化:从封装 - 板级互连局限到封装内互连技术演进(一)

本文针对高速SerDes互连链路中的关键电磁效应展开研究:1)揭示了封装-主板互连结构在毫米波频段易激发谐振效应,导致53GHz传输陷波和阻抗偏移;2)提出基于本征模分析的谐振抑制方法,通过优化接地过孔排布使带宽突破95GHz;3)系统比较了方形/六边形BGA排布下23种差分对朝向的串扰特性,证实六边形阵列可将功率和串扰降低30%以上;4)论证了100GHz以上带宽需采用封装内互连架构,其较传统方案减少50%阻抗不连续节点。

小孟同学的博客 229

Redis典型应用之分布式锁

在一个分布式系统中,也会涉及到多个节点同时去访问一个公共资源的时候,此时就需要通过锁来做互斥控制,避免出现类似于“线程安全”的问题~~本质上来说就是使用一个公共的服务器,用来记录加锁状态当然这个服务器也可以是Redis,也可以是其他的组件(MySQL、ZooKeeper等),自己手搓也行。

Obto_的博客 1442

超声波传感器(CHx01) 学习笔记 Ⅲ-API介绍

超声波传感器(CHx01) API介绍

nicole088的专栏 1386

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Redis分布式锁最佳实践,助你实现高性能、高并发的分布式应用

数据库乐观锁;基于Redis的分布式锁;基于ZooKeeper的分布式锁本篇博客将介绍第二种方式,基于Redis实现分布式锁。虽然网上已经有各种介绍Redis分布式锁实现的博客,然而他们的实现却有着各种各样的问题,为了避免误人子弟,本篇博客将详细介绍如何正确地实现Redis分布式锁。本文主要介绍了如何使用Java代码正确实现Redis分布式锁,对于加锁和解锁也分别给出了两个比较经典的错误示例。其实想要通过Redis实现分布式锁并不难,只要保证能满足可靠性里的四个条件。

资料免费分享,点击名片 423

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

分布式锁的实现与应用

分布式锁是控制分布式系统不同进程并发访问共享资源的一种锁的实现。如果不同主机之间共享了某个临界资源(例如数据库中的数据),往往需要互斥来防止彼此干扰,以保证一致性。作用:分布式集群中多个服务请求同一方法或者同一个业务操作(比如秒杀)的情况下,对应的业务逻辑只能被一台机器上的一个线程执行,避免出现并发安全问题。

m0_51561690的博客 449

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Redis 分布式锁的实现原理和应用场景

Redis 分布式锁是一种基于 Redis 数据库实现的分布式锁机制。它主要是通过 Redis 提供的原子操作命令(如 SETNX,EXPIRE)实现。在 Redis 中,可以使用 SETNX 命令实现分布式锁的获取,使用 EXPIRE 命令实现分布式锁的过期。当某个应用实例成功获取到锁后,其他实例则不能再获取该锁。在分布式环境下,Redis 分布式锁可以确保只有一个应用实例能够执行关键代码,从而保证数据的一致性和可靠性。Redis 分布式锁是一个基于 Redis 数据库实现的分布式锁机制。

网络技术联盟站 3253

Redisson实现分布式锁应用解析与源码分析

Redisson 是一个基于 Redis 的分布式 Java 客户端。它提供了丰富的功能和工具,帮助开发者在分布式系统中解决数据共享、并发控制和任务调度等问题。通过使用Redisson,开发者可以轻松地操作 Redis 的分布式对象(如集合、映射、队列等),实现可靠的分布式锁机制,以及管理和调度分布式环境中的任务和服务。

m0_49692893的博客 1079

分布式锁原理及使用

2、每个客户端都会获取/lock节点下所有创建的子节点(所有客户端创建的子节点锁),客户端获取到所有的子节点之后,开始比较子节点的顺序编号,顺序编号在这里就会起到决定性的作用,如果客户端发现自己创建的子节点顺序编号最小,那么就认为该客户端获取到了锁,使用完锁之后就会将节点删除。4、如果客户端从监听事件中得知比自己子节点编号小的节点被删除了,此时会再次判断自己的子节点编号是不是所有子节点中最小的,如果是,则获取到锁,如果不是则重复上步骤继续获取到比自己小的子节点并且监听事件信息。常见的方式有乐观锁和悲观锁。

weixin_52120555的博客 299

Java使用Redis与RedisTemplate实现分布式锁(应用场景:防止定时任务重复执行)

Java使用Redis与RedisTemplate实现分布式锁

源丶动丶力 1181
上一篇: 【业务功能篇71】Cglib的BeanCopier进行Bean对象拷贝
下一篇: 【业务功能篇73】分布式ID解决方案
studyday1
博客等级 码龄9年 6454粉丝 255原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值