分布式锁的详细解析

news2024/11/23 7:16:51

分布式锁工具

一、背景

当前问题:项目中会使用到分布式锁用于定时任务、接口幂等性处理,但是分布式锁的实现较简单,会出现执行超时、加解锁失败等场景。分布式锁都有哪些实现,他们的优劣势是什么呢?

二、现有技术

分布式锁实现目的如下图:

1.reids分布式锁实现

  1. 第一种直接通过redis提供的setNx命令执行加锁,可以设置value值。不能设置锁的有效期,如果不调用del命令,会一直存在。
  2. 第二种通过lua脚本执行加锁。可以直接使用set命令进行加锁,然后设置锁的有效期,也可以使用hashSet方式,将所有的锁都保存在同一个hash数组中,通过hash中的key值进行区分,缺点是在redis中hash类型key值有效期是针对整个hashKey的。

以上两种方式都能完成加锁操作,第二种能够自由设置锁的有效期。

基于jimdb的加锁实现方式比较如下

  1. jimdb事务方式:批量传入多个命令后,不间断的执行传入的命令,但不保证原子性
  2. pipeline方式:批量传入多个命令后,与其他请求竞争后执行命令,不保证原子性
  3. lua脚本方式:批量传入多个命令后,原子性的执行
  4. set命令,jimdb直接支持setEx命令,可以在设置锁的同时设置锁的有效期,不支持重入

为什么不能先执行setNx,然后在执行expire命令,这样第一种也有有效期了呢?两个命令分开执行不具有原子性,比如加锁成功了,但在执行expire命令时失败了,还是不具有有效期。

优缺点:

  1. 缺点:即使设置有效期成功了,如果操作共享资源的时间大于过期时间,就会出现锁提前过期的问题,进而导致分布式锁直接失效。如果锁的超时时间设置过长,加过期时间与不加没有了区别。
  2. 优点:通过lua脚本可以实现原子性

2.redisson实现方式

需要手动初始化RedissonLock,然后进行lock操作,内部通过lua脚本的方式进行加锁,方法结束后再finally中进行unlock解锁。如果加锁时不指定过期时间,会自动续期。加锁失败会自动重试

缺点:1.目前redisson未解决redLock问题 2.redisson未解决执行超时情况 3.仅支持redis

3.zookeeper分布式锁实现

ZooKeeper 分布式锁是基于临时顺序节点Watcher(事件监听器)实现的。

  • 临时节点:临时节点的生命周期是与客户端会话(session)绑定的,会话消失则节点消失。并且,临时节点只能做叶子节点,不能创建子节点。
  • Watcher事件监听:是 ZooKeeper 中的一个很重要的特性。ZooKeeper 允许用户在指定节点上注册一些 Watcher,并且在一些特定事件触发的时候,ZooKeeper 服务端会将事件通知到感兴趣的客户端上去,该机制是 ZooKeeper 实现分布式协调服务的重要特性。

获取锁:

  1. 首先要有一个持久节点/locks,客户端获取锁就是在locks下创建临时顺序节点。
  2. 假设客户端 1 创建了/locks/lock1节点,创建成功之后,会判断 lock1是否是 /locks 下最小的子节点。
  3. 如果 lock1是最小的子节点,则获取锁成功。否则,获取锁失败。
  4. 如果获取锁失败,则说明有其他的客户端已经成功获取锁。客户端 1 并不会不停地循环去尝试加锁,而是在前一个节点比如/locks/lock0上注册一个事件监听器。这个监听器的作用是当前一个节点释放锁之后通知客户端 1(避免无效自旋),这样客户端 1 就加锁成功了。

释放锁:

  1. 成功获取锁的客户端在执行完业务流程之后,会将对应的子节点删除。
  2. 成功获取锁的客户端在出现故障之后,对应的子节点由于是临时顺序节点,也会被自动删除,避免了锁无法被释放。
  3. 事件监听器监听的就是这个子节点删除事件,子节点删除就意味着锁被释放。

优缺点:性能是唯一缺点,另外仅需要分布式锁功能而搭建zooker集群是不划算的。

4.数据库分布式锁

在数据库中增加一张锁表。

  1. 简单:每次加锁时,插入一条数据,解锁时删除数据。
  2. 使用悲观锁。通过for update增加悲观锁。
  3. 使用乐观锁,表中增加版本号的概念。

优点:不需要额外部署外部服务

缺点:数据库的各种实现方式均有一些问题,通用的缺点就是性能不高,同时为数据库带来很大压力。在实现可重入、自动解锁、自动重试加锁等功能上均比较复杂。写主读从架构上,悲观锁还要考虑主从同步问题。

5.ETCD分布式锁

1.什么是etcd?

etcd 是一个分布式可靠的键值存储,用于存储分布式系统中最重要的数据,重点在于:

  • 简单:定义明确、面向用户的 API(gRPC)
  • 安全:自动 TLS,带有可选的客户端证书身份验证
  • 快速:基准速度为 10,000 次写入/秒
  • 可靠:使用 Raft 分布式协议

etcd 用 Go 编写,使用Raft共识算法来管理高可用性复制日志。

etcd 特性:

  • 租约机制:用于支撑异常情况下的锁自动释放能力。可以自由设置过期时间
  • 前缀和 Revision 机制:用于支撑公平获取锁和排队等待的能力,通过前缀和获取,通过revision进行顺序执行
  • 监听机制:用于支撑抢锁能力
  • 集群模式:用于支撑锁服务的高可用

2.如何用etcd实现分布式锁?

优点:通过raft协议保证一致性,防止脑裂,惊群效应,自带续期功能,性能高,高可用。

缺点: 吞吐量低(相比redis)。公司提供etcd集群使用,但是之前出现过购物车开天窗问题,集团不允许在高负载情况下请求直接打到etcd,所以这是唯一缺点。

6.分布式锁横向对比

三、分布式锁工具结论

方案:以上对比可知,在较低低吞度量场景下,etcd的实现方式是最好的

四、参考资料

  1. redis官方文档:Distributed Locks with Redis | Docs
  2. 分布式锁中的王者方案 - Redisson_redis_悟空聊架构_InfoQ写作社区
  3. Redis 分布式锁|从青铜到钻石的五种演进方案 - 悟空聊架构的个人空间 - OSCHINA - 中文开源技术交流社区
  4. jimdb支持命令:https://cf.jd.com/pages/viewpage.action?pageId=584518003
  5. jimdb帮助文档:登录JoySpace
  6. jimdb事务:事务 — Redis 设计与实现
  7. redisson:https://github.com/redisson/redisson/wiki
  8. etcd:GitHub - etcd-io/etcd: Distributed reliable key-value store for the most critical data of a distributed system
  9. etcd实现分布式锁:https://www.51cto.com/article/722138.html

关于redLock:

  1. How to do distributed locking — Martin Kleppmann’s blog
  2. Is Redlock safe? - <antirez>
  3. http://zhangtielei.com/posts/blog-redlock-reasoning.html、基于Redis的分布式锁到底安全吗(下)? - 铁蕾的个人博客 对于第一个和第二个的中文翻译和总结。。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1:25万基础电子地图(西藏版)

我们为你分享过四川版、云南版、江西版、贵州版、重庆版和青海版的1比25万基础电子地图&#xff0c;现在再为你分享西藏版的电子地图。 如果你需要西藏版的1比25万基础电子地图&#xff0c;你可以在文末查看该数据的领取方法。 基础电子地图西藏版 西藏版1:25万基础电子地图…

vue3.0(十六)axios详解以及完整封装方法

文章目录 axios简介1. promise2. axios特性3. 安装4. 请求方法5. 请求方法别名6. 浏览器支持情况7. 并发请求 Axios的config的配置信息1.浏览器控制台相关的请求信息&#xff1a;2.配置方法3.默认配置4.配置的优先级5.axios请求响应结果 Axios的拦截器1.请求拦截2.响应拦截3.移…

让围绕数据库构建大模型应用更简单方便--DB-GPT

DB-GPT的目的是构建大模型领域的基础设施&#xff0c;通过开发多模型管理(SMMF)、Text2SQL效果优化、RAG框架以及优化、Multi-Agents框架协作、AWEL(智能体工作流编排)等多种技术能力&#xff0c;让围绕数据库构建大模型应用更简单&#xff0c;更方便。 1 处理流程 DB-GPT系…

《涅朵奇卡:一个女人的一生》读后感

这周的计划是看完海明威的《丧钟为谁而鸣》&#xff0c;但是因为下班晚&#xff0c;而且书的体量大&#xff0c;所以只看了一半。本来以为这周的阅读计划完不成了&#xff0c;不料昨天加完班后拿起新到的《涅朵奇卡&#xff1a;一个女人的一生》&#xff0c;不自觉就陷进去了&a…

Zynq系列FPGA实现SDI视频编解码+图像缩放,基于GTX高速接口,提供4套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本博已有的FPGA图像缩放方案本方案的无缩放应用本方案在Xilinx--Kintex系列FPGA上的应用 3、详细设计方案设计原理框图SDI 输入设备Gv8601a 均衡器GTX 解串与串化SMPTE SD/HD/3G SDI IP核BT1120转RGB纯V…

音乐播放器小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;歌曲信息管理&#xff0c;会员优惠管理&#xff0c;用户管理&#xff0c;会员办理管理&#xff0c;歌曲分类管理&#xff0c;会员信息管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;歌曲信息…

机器学习 C++ 的opencv实现SVM图像二分类的训练 (二)【附源码】

本节讲机器学习 C 的opencv实现SVM图像二分类的训练&#xff0c;下节讲测试&#xff1a; 数据集合data内容如下&#xff1a; 下载地址为&#xff1a;https://download.csdn.net/download/hgaohr1021/89506900 #include <stdio.h> #include <time.h> #include…

时钟切换的代码

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 参考代码 描述 题目描述&#xff1a; 存在两个同步的倍频时钟clk0 clk1,已知clk0是clk1的二倍频&#xff0c;现在要设计一个切换电路&#xff0c;sel选择时候进行切换&#xff0c;要求没有毛刺。 信号示意图&…

中控室监控台在水处理行业的作用

随着工业化和城市化的快速推进&#xff0c;水处理行业的重要性日益凸显。作为确保水质安全、提高水资源利用效率的关键环节&#xff0c;水处理厂需要高效、稳定地运行。在这个过程中&#xff0c;中控室监控台发挥着不可或缺的作用。本文将从以下几个方面&#xff0c;详细阐述中…

Go语言--运算符

算术运算符 关系运算符 不能写0<a<10&#xff0c;要判断必须0<a&&a<10。因为int和bool不兼容 逻辑运算符 位运算符 赋值运算符 其他 运算符的优先级

Elasticsearch基础(二):阿里云Elasticsearch快速入门

文章目录 阿里云Elasticsearch快速入门 一、资源领取 二、访问实例 三、创建索引 四、插入数据 五、搜索数据 1、全文搜索 2、按查询条件搜索 六、删除数据 阿里云Elasticsearch快速入门 一、资源领取 这里资源领取只针对新用户&#xff0c;如果是老用户按需购买&am…

AI生成模特图需要什么软件

&#x1f31f; AI生成模特图需要什么软件&#xff1a;触站AI&#x1f680; 触站AI&#xff0c;作为一家专注于企业AI图像领域的技术解决方案服务公司&#xff0c;以其卓越的AI绘画模型训练、AI绘图模型定制服务&#xff0c;引领着行业的新潮流。 ① AI绘画模型训练&#xff1a…

IDEA中使用Maven打包及碰到的问题

1. 项目打包 IDEA中&#xff0c;maven打包的方式有两种&#xff0c;分别是 install 和 package &#xff0c;他们的区别如下&#xff1a; install 方式 install 打包时做了两件事&#xff0c;① 将项目打包成 jar 或者 war&#xff0c;打包结果存放在项目的 target 目录下。…

Kamailio-SIP代理服务器单节点的安装与部署

使用背景&#xff1a;存在 Freeswitch 等语音网关应用服务&#xff0c;期望实现负载均衡、前置处理的功能&#xff0c;类似于Web应用服务的Nginx的角色 市场调研&#xff0c;发现了几家颇受欢迎的开源产品&#xff1a; KamailioOpenSIPSAsterisk Kamailio和OpenSIPS由于其灵…

vlan基础相关

7.2以太网交换基础 数据链路层也叫2层网络&#xff0c;用的是Mac地址&#xff0c;想到Mac地址就要想到交换机。 以太网协议&#xff08;LAN&#xff09;以太网是建立在CSMA/CD载波监听多路访问/冲突检测&#xff0c;机制上的广播型网络。CSMA工作原理是先监听&#xff0c;在介…

《C++20设计模式》适配器模式经验分享

文章目录 一、前言二、对于接口的讨论三、实现1、对象适配器1.1 UML类图1.2 实现 2、类适配器 四、最后 一、前言 从适配器模式开始就是类的组合聚合&#xff0c;类与类之间结构性的问题了。 适配器模式解决的问题&#xff1a; 适配器模式能够在不破坏现有系统结构的情况下&a…

震惊!张宇强化36讲1200页,暑期强化高效利用指南!

特别喜欢张宇老师的讲课风格 如果你打算跟张宇老师&#xff0c;那么基础——>强化——>冲刺&#xff0c;你应该这么买书&#xff01; 张宇老师25版课程大改版&#xff0c;其中&#xff0c;36讲的变动是最大的&#xff0c;张宇老师25版课程把以往的强化课程前移&#xff0…

Lumière:开创性的视频生成模型及其应用

视频内容创造领域迎来了突破性进展&#xff0c;但视频生成模型由于运动引入的复杂性而面临更多挑战。这些挑战主要源自运动的引入所带来的复杂性。时间连贯性是视频生成中的关键要素&#xff0c;模型必须确保视频中的运动在时间上是连贯和平滑的&#xff0c;避免出现不自然的跳…

法国工程师IMT联盟 密码学及其应用 2023年期末考试补考题

1 JAVA 安全 1.1 问题1 1.1.1 问题 用 2 或 3 句话解释 Java 执行模型&#xff08;Java 虚拟机machine virtuelle Java)&#xff09;中引入introduit沙箱bac sable机制 mcanisme d’excution par isolation的目的。 1.1.2 问题解释 在 Java 执行模型&#xff08;Java 虚拟机…

带电池监控功能的恒流直流负载组

EAK的交流和直流工业电池负载组测试仪对于测试和验证关键电力系统的能力至关重要&#xff0c;旨在实现最佳精度。作为一家客户至上的公司&#xff0c;我们继续尽我们所能应对供应链挑战&#xff0c;以提供出色的交货时间&#xff0c;大约是行业其他公司的一半。 交流负载组 我…