什么是分布式锁,分布式锁有什么作用?

article/2025/10/13 4:21:41

1 、什么是分布式锁

为了防止分布式系统中的多个进程之间相互干扰,我们需要一种分布式协调技术来对这些进程进行调度。而这个分布式协调技术的核心就是来实现这个分布式锁。

2、为什么要使用分布式锁
在这里插入图片描述

成员变量 A 存在 JVM1、JVM2、JVM3 三个 JVM 内存中;
成员变量 A 同时都会在 JVM 分配一块内存,三个请求发过来同时对这个变量操作,显然结果是不对的;
不是同时发过来,三个请求分别操作三个不同 JVM 内存区域的数据,变量 A 之间不存在共享,也不具有可见性,处理的结果也是不对的;
注:该成员变量 A 是一个有状态的对象;
如果我们业务中确实存在这个场景的话,我们就需要一种方法解决这个问题,这就是分布式锁要解决的问题

3、分布式锁有哪些实现

Memcached
Redis
Zookeeper
chubby

4、Redis 分布式锁实现

加锁

命令: setnx(key,value);
当一个线程执行 setnx 返回 1,说明 key原本不存在,该线程成功得到了锁;当一个线程执行 setnx 返回 0,说明 key 已经存在,该线程抢锁失败

解锁

有加锁就得有解锁。当得到锁的线程执行完任务,需要释放锁,以便其他线程可以进入。释放锁的最简单方式是执行 del 指令,伪代码:del(key) ,释放锁之后其他线程就可以通过执行setnx,来获取锁

锁超时

锁超时是什么意思呢?如果一个得到锁的线程在执行任务的过程中挂掉,来不及显式地释放锁,这块资源将会永远被锁住(死锁),别的线程再也别想进来。所以,setnx的 key 必须设置一个超时时间,以保证即使没有被显式释放,这把锁也要在一定时间后自动释放。setnx 不支持超时参数,所以需要额外的指令,伪代码如下 :
expire(lock_sale_商品ID, 30)
if(setnx(lock_sale_商品ID,1) == 1){ expire(lock_sale_商品ID,30) try { do
something … } finally { del(lock_sale_商品ID) } }

存在的问题

以上伪代码存在三个致命问题 ,如下问题:

1、setnx 和 expire 命令组合的非原子性 ;

当某线程执行 setnx,成功得到了锁,setnx刚执行成功,还未来得及执行 expire 指令,节点 1 挂掉了。这样一来,这把锁就没有设置过期时间,变成死锁,别的线程再也无法获得锁了。
怎么解决呢?setnx 指令本身是不支持传入超时时间的,set 指令增加了可选参数,伪代码如下:
//将key设置为1,过期时间为30秒,设置方式为 setnx set(key,1,30,NX)

2、del 误删

又是一个极端场景,假如某线程成功得到了锁,并且设置的超时时间是 30 秒。

在这里插入图片描述

如果某些原因导致线程 A 执行的很慢很慢,过了 30 秒都没执行完,这时候锁过期自动释放,线程 B 得到了锁。

在这里插入图片描述

随后,线程 A 执行完了任务,线程 A 接着执行 del 指令来释放锁。但这时候线程 B 还没执行完,线程A实际上 删除的是线程 B加的锁。

在这里插入图片描述

怎么避免这种情况呢?可以在 del 释放锁之前做一个判断,验证当前的锁是不是自己加的锁。至于具体的实现,可以在加锁的时候把当前的线程 ID当做 value,并在删除之前验证 key 对应的 value 是不是自己线程的 ID。
加锁:
String threadId = Thread.currentThread().getId() set(key,threadId ,30,NX)
解锁:
if(threadId .equals(redisClient.get(key))){ del(key) }
但是,这样做又隐含了一个新的问题,判断和释放锁是两个独立操作,不是原子性。

3、出现并发的可能性

如同上述描述:当线程 A 执行的很慢很慢,过了 30 秒都没执行完,这时候锁过期自动释放,线程 B
得到了锁。此时就有多个线程在访问同步代码块
解决:
我们可以让获得锁的线程开启一个守护线程,用来给快要过期的锁“续航”。

在这里插入图片描述

当过去了 29 秒,线程 A 还没执行完,这时候守护线程会执行 expire 指令,为这把锁“续命”20 秒。守护线程从第 29 秒开始执行,每 20 秒执行一次。

在这里插入图片描述

当线程 A 执行完任务,会显式关掉守护线程。

在这里插入图片描述


http://chatgpt.dhexx.cn/article/0pvRmL2U.shtml

相关文章

分布式锁以及三种加锁方式

在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。那具体什么是分布式锁,分布式锁应用在哪些业务场景、如何来实现分布式锁呢? 一 为什么要使用分布式锁 我们在开发…

分布式架构 --- 分布式锁

分布式锁 1. 研究背景及其意义2. 分布式锁的介绍2.1 分布式锁2.2 为什么需要分布式锁2.3 分布式锁的基本要求 3. 分布式锁的实现3.1 基于数据库的分布式锁3.1.1选用数据库实现分布式锁的原因3.1.2 基于数据库实现分布式锁的缺点3.1.3分布式锁的实现 3.2 基于Redis的分布式锁3.2…

分布式锁的区别

分布式锁,是一种思想,它的实现方式有很多。比如,我们将沙滩当做分布式锁的组件,那么它看起来应该是这样的 加锁 在沙滩上踩一脚,留下自己的脚印,就对应了加锁操作。其他进程或者线程,看到沙滩上…

分布式锁的实现方式

背景 分布式场景中的数据一致性问题一直是一个比较重要的话题。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance&#xff09…

分布式锁-Redisson

分布式锁 1、分布式锁1.1 本地锁的局限性1.1.1 测试代码1.1.2 使用ab工具测试(单节点)1.1.3 本地锁问题演示(集群情况) 1.2 分布式锁实现的解决方案1.3 使用Redis实现分布式锁(了解即可)1.3.1 编写代码1.3.2 压测 1.4 使用Redisson解决分布式锁1.4.1 实现代码1.4.1 压测1.4.2 可…

Redis 分布式锁

文章目录 一、分布式锁概念二、使用setnx实现锁三、编写代码测试分布式锁1. 使用Java代码测试分布式锁2. 优化之设置锁的过期时间 四、优化之给lock设置UUID防误删五、使用LUA脚本保证删除的原子性 一、分布式锁概念 随着业务发展的需要,原单机部署的系统被演化成分…

关于分布式锁

先别说了别的,先来一个总结。 synchronized 单机版可以,但是上了分布式就不行了。 nginx 分布式服务单机锁就不行 取消单机锁,上redis分布式锁setnx 注意的问题: 如果只加了锁,没有释放锁,出现异常的话…

Redisson分布式锁详解

概述 setnx分布式锁的问题 重入问题 重入问题是指获得锁的线程可以再次进入到相同的锁的代码块中,可重入锁的意义在于防止死锁,比如HashTable这样的代码中,它的方法都是使用synchronized修饰的,假如它在一个方法内,…

redission实现分布式锁

在开始提到Redis分布式锁之前,先说一下redis中的两个命令。 SETNX key valuesetnx 是SET if Not eXists(如果不存在,则 SET)的简写。 用法如图,如果不存在set成功返回int的1,这个key存在了返回0。 SETEX key seconds value上面…

Java分布式锁

文章目录 1.什么是锁?2.什么是分布式?分布式场景 3.什么是分布式锁?4.我们应该怎么设计分布式锁?5.基于数据库的分布锁5.1 基于表主键唯一做分布式锁5.2 基于表字段版本号做分布式锁 6.基于 Redis 做分布式锁6.1 基于 REDIS 的 SE…

Redis分布式锁

概述 日常开发中,秒杀下单、抢红包等等业务场景,都需要用到分布式锁。而Redis非常适合作为分布式锁使用。本文将分七个方案展开,跟大家探讨Redis分布式锁的正确使用方式。如果有不正确的地方,欢迎大家指出哈,一起学习一…

Zookeeper分布式锁

实现一把分布式锁通常有很多方法,比较常见的有 Redis 和 Zookeeper。 Redis分布式锁可参考之前的文章: Redisson 分布式锁原理分析:https://blog.csdn.net/qq_42402854/article/details/123342331 Zookeeper能实现分布式锁,是因…

分布式锁

分布式锁实践 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段。有很多三方库和文章描述如何用Redis实现一个分布式锁管理器,但是这些库实现的方式差别很大,而且很多简单的实现其实只需采用稍微增加一点复杂的设计就可…

分布式系列之分布式锁几种实现机制

在分布式系统中,分布式锁用来解决分布式系统中多线程、多进程在不同机器上共享资源访问的问题。本文简要介绍分布式锁的四种实现机制,包括数据库、Redis缓存、Zookeeper和Etcd,以加深了解。 1、分布式锁介绍 在单体应用中,通过锁…

三种分布式锁

----------本文为学习记录如有错误帮忙指正 一、什么是分布式锁? 在单机系统下,如果多个线程同时访问一个变量或者代码片段就会产生多线程问题。(被访问的变量或者代码片段被称之为临界区域)这时我们就需要让所有线程按顺序一个一…

Redis实现分布式锁

目录 一、前言 为什么需要分布式锁? 二、基于redis实现分布式锁 为什么redis可以实现分布式锁? 如何实现? 锁的获取 锁的释放 三、如何避免死锁?锁的过期时间如何设置? 避免死锁 锁过期处理 释放其他服务的锁…

什么是分布式锁?几种分布式锁分别是怎么实现的?

一、什么是分布式锁: 1、什么是分布式锁: 分布式锁,即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资源访问的问题,而分布式锁,就是解决了分布式系统中控制共享资源访问的问题。与单体应用不同的是&am…

软件需求最佳实践笔记(一)

1.软件需求最佳实践笔记 | 需求框架 前言:SERU是一套系统全面的需求方法论,可指导我们日常的软件需求工作。曾参加过徐峰老师软件需求最佳实践课程的培训,收益颇多,现通过笔记形式整理出来,以期与具有同样需求的读者共…

声音信号基音提取算法基频和谐波处理分析

1、内容简介 略 293-可以交流、咨询、答疑 2、内容说明 略 一、 实验原理: 傅里叶变换建立了信号频谱的概念。所谓傅里叶分析即分析信号的频谱(频率构成)、频带宽度等。要想合成出一段音乐,就要了解该段音乐的基波频率、谐波构成等。因此,必须采用傅里叶变换这…

软件工程—需求分析阶段

第一步、需求获取 为了保证能全面地获取信息,以更好地服务于产品设计和迭代,产品经理必须利用内部外部等多种渠道来获取用户需求。并且因渠道差异,产品经理所采取的方式与方法也相应会有所差异,所以产品经理还必须根据不同的渠道…