redis锁

article/2025/10/26 6:53:15

一、redis锁的实现

加锁命令:

SETNX key value:
当键不存在时,对键进行设置操作并返回成功1,否则返回失败0。
Key是锁的唯一标识,一般按业务来决定命名;
Value 往往用来比较加锁的是哪一个线程或者哪一个消息,
一般使用UUID.randomUUID().toString()方法生成。
例如:setnx(key,1)

复制

解锁命令:

DEL key
通过删除键值对释放锁,以便其他线程可以通过 SETNX 命令来获取锁。
例如:del(key)

复制

锁超时:

EXPIRE key timeout
设置 key 的超时时间,以保证即使锁没有被显式释放,
锁也可以在一定时间后自动释放,避免资源被永远锁住。
例如:expire(key,30),表示30s超时释放锁。

复制

备注:

Redis 2.6.12以上版本为set指令增加了可选参数,伪代码如下:
set(key,1,30,NX),它将加锁和超时两个动作合并到了一起,利用原子性封装了起来。

复制

二、redis锁解决的具体场景

场景1: 为什么redis锁需要设置超时?

原因分析:
1.redis与业务进程之间通常是使用网络通讯的方式进行数据加锁的,而网络通讯就存在丢包的情况。
再加上加锁和解锁是两个操作,这样就会存在锁永远不能释放的问题。
2.除此之外业务进程在加锁之后,也可能panic掉,没有办法去释放掉这个锁,导致分布式锁被永远挂住。基于上面的两个原因:
分布式锁就需要一个超时时间来主动释放这个锁,防止分布式锁一直被挂住。

复制

redis分布式锁的解决办法,
1.通过加锁和超时两步操作来解决,不过我们最好使用set(key,1,30,NX)这种原子操作。
2.使用setnx和expire两个操作的话,因为它们不是原子性操作,也会存在上面1和2的问题,
进而导致锁被永远锁住,不过也不是没有办法,
我们可以采用lua脚本在redis上面实现的方式来保证它们的原子性。

复制

场景2: 锁超时释放了之后,加锁的业务又过来释放锁怎么办?

具体场景,进程1在超时释放了锁之后,进程2获取到了锁,后来进程1又释放锁,如此以来就有可能导致进程2没有完成就被进程1释放了锁。如下所示:

解决上面问题的关键点,在于我们在释放锁的时候,能够判断出来是不是当前加锁的进程发起的解锁操作。一般是将进程id作为vlaue放到setnx中,在解锁之前先去判断一把这个锁是不是同一个进程的,
是就允许释放,不是就不允许解锁。备注:这种操作其实是两步操作,判断锁,释放锁,它们并不是一个原子操作,
如此以来就存在一步操作完成,另一步没有被操作的情况。解决办法是,利用lua脚本实现锁的原子性。

复制

场景3:锁超时释放之后,会不会存在两个业务同时处理加锁的代码的情况?

这个场景与场景2是一个问题的延伸,一旦我们在设置锁的超时时间过短,就会发生这个情况。

锁在被进程2拿走之后,进程1还没有执行代码结束,
如此以来就会存在进程1和进程2同时操作那段公共代码的情况,
这样就会出问题,也显然不是我们期望的场景。

复制

对于这个场景的解决办法,往往有两个:

1.调整超时时间,让业务进程在这段时间之内一定可以执行完毕。
2.启动守护进程,在业务进程没有执行完成的时候,主动的去调节这个超时时间,
让锁的超时时间变长。

复制

场景4:锁被使用之后,其他的业务如何才能获取这个分布式锁?

这个场景,是非常基本的场景,一旦锁被进程1获取之后,在释放锁之前,进程2是怎么知道何时才能够获取到锁呢?

这个解决办法有点像操作系统的轮询和信号量两种。

1.轮询的话,就需要进程2不停的去超时加锁,直到能够加锁成功位置,
不过这种实现比较耗费服务器资源。
2.类似信号量的方法,业务进程2将加锁消息进行订阅操作,
而订阅模块会维护一个消息队列,等到锁释放之后,
便从队列中取出进程2,告知锁已经释放的通知。
进程2收到通知以后,就可以进行加锁操作了。

复制

场景5:redis是集群的话,使用redis分布式锁会不会有问题?

为了保证redis的可用性,往往redis服务器会设置主从,主从服务器中的从服务器在检测到主服务器挂掉之后,就会重新选举一个作为主服务器,而redis锁是操作在主服务器上的。

一旦,发生下面的现象:

1.主服务器刚刚被进程1加锁完成,还没有来得及同步数据到从服务器就挂掉了。
2.从服务器经过选举,选出了新的主服务器。
3.进程2在新的主服务器上加锁成功。
4.如此以来进程1和进程2都会同时操作那段公共代码,这样就会存在问题,算是加锁失败。

复制

针对这种问题,我们其实没有太好的办法,不过还好这种数据的概率比较低。

Redis 分布式锁只能作为一种缓解并发的手段,要完全解决并发问题,仍需要数据库的防并发手段配合使用。


http://chatgpt.dhexx.cn/article/4uM6q2Kh.shtml

相关文章

超图 hypergraph 二分图 Bipartite graph

超图是什么 超图超图的意义应用 二分图 超图 超图是什么? 超图的本质特征在于它的超边,它可以连接两个以上的结点(包括两个)。按这样的意义来说,我们所熟悉的普通图只是超图的一个特例而已,而超图则定义了一个更加宽泛的图。 超图…

BiNE: Bipartite Network Embedding 阅读笔记

论文传送门 作者 华东师范大学: 高明周傲英Leihui Chen 中国科学技术大学:何向南 摘要 传统的学习图数据的节点表示的方法大都聚焦于一般的同构网络,忽略了二部图的特殊性质。因此这些方法对于二部图嵌入来说可能是次优的。 本文提出了B…

C#,图论与图算法,二分图(Bipartite Graph)最佳二分匹配(Maximum Bipartite Matching)算法与源程序

二部图中的匹配是一组边的选择方式,使两条边不共享一个端点。最大匹配是最大大小(最大边数)的匹配。在最大匹配中,如果向其添加任何边,则该边不再是匹配。对于给定的二部图,可以有多个最大匹配。 我们为什…

【论文精读】Bipartite network projection and personal recommendation

一、Introduction 在过去的几年里,人们对复杂网络进行了大量的研究,一类特殊的网络是二部网络(bipartite network)。特点是其节点可分割为两个互不相交的子集X和Y,连接只允许存在于不同集合中两个节点之间。例如人类的…

【一致性仿真】Group-Bipartite Consensus in the Networks With Cooperative-Competitive Interactions

文章链接:Group-Bipartite Consensus in the Networks With Cooperative-Competitive Interactions 仿真图Fig3: MATLAB代码 % Group-Bipartite Consensus in the Networks With Cooperative-Competitive Interactions % Protocol Simulation Results …

C#,图论与图算法,二分图(Bipartite Graph)的霍普克罗夫特-卡普(Hopcroft Karp)最大匹配算法与源程序

二分图Bipartite graph 有没有可能通过数学过程找到你的灵魂伴侣?大概让我们一起探索吧! 假设有两组人注册了约会服务。在他们注册后,会向他们展示另一组人的图像并给出他们的描述。他们被要求选择他们愿意与之匹配的人。 所有信息都被输入…

[VLDB 2022]Butterfly Counting on Uncertain Bipartite Graphs

总结 非确定二部图上的蝴蝶结构统计,精确算法。在普通的蝴蝶结构统计上,增加了边权重,使得传统算法失效,再在这基础上定义新的统计并优化老方法。 动机 Butterfly的数量直接展示了二部图的密度,是个很重要的属性。相…

二分匹配大总结——Bipartite Graph Matchings[LnJJF]

文章目录 二分匹配——Bipartite Graph Matchings[LnJJF]认识:什么是二分图?理解:现实模型如何与二分图相互转化?如何判断能否转化?能够转化的话,如何转化? 应用:已知一个二分图&…

【一致性仿真】Fixed-time bipartite consensus of multi-agent systems with disturbances

文章链接:Fixed-time bipartite consensus of multi-agent systems with disturbances 仿真图Fig2: MATLAB代码: % Fixed-time bipartite consensus of multi-agent systems with disturbances % author:JCGUY % date:2022-04-20 clear clc…

Bipartite Graph多视图学习聚类文章总结

看了一些anchor graph和bipartite graph 的文章始终不知道他们的区别在哪里。今天总结一下这类文章。 1.能看到最早的这类关于多视图学习的文章 Large-Scale Multi-View Spectral Clustering via Bipartite Graph(AAAI-2015) 目标:we addre…

Fast spectral clustering learning with hierarchical bipartite graph for large-scale data

Fast spectral clustering learning with hierarchical bipartite graph for large-scale data 基于层次二分图的大规模数据快速谱聚类学习 abstract 传统方法:不适用大规模问题 高斯核函数 提出了一种新的基于层次二分图(SCHBG)的光谱聚…

Bipartite Graph Based Multi-View Clustering

Bipartite Graph Based Multi-View Clustering 基于二部图的多视图聚类 abstract 对于基于图的多视图聚类,一个关键问题是通过两阶段学习方案捕获共识聚类结构。具体来说,首先学习多个视图的相似性图矩阵,然后将它们融合为统一的高级图矩阵。…

BiNE: Bipartite Network Embedding

** BiNE: Bipartite Network Embedding ** SIGIR 2018 论文链接:https://dl.acm.org/doi/10.1145/3209978.3209987 项目代码:https://github.com/clhchtcjj/BiNE 文章目录 BiNE: Bipartite Network Embedding 摘要1、Introduction2、Related work&a…

【Paper】2020_Event-triggered bipartite consensus over cooperation-competition networks under DoS atta

Hu, A., Park, J.H., Cao, J. et al. Event-triggered bipartite consensus over cooperation-competition networks under DoS attacks. Sci. China Technol. Sci. 64, 157–168 (2021). 文章目录 1 Introduction2 Problem description and preliminaries2.1 Multiagent model…

Bipartite graph/network学习

Bipartite graph/network翻译过来就是:二分图。 维基百科中对二分图的介绍为:二分图是一类图(G,E),其中G是顶点的集合,E为边的集合,并且G可以分成两个不相交的集合U和V,E中的任意一条边的一个顶点属于集合…

bipartite matching二分图匹配

目录 二分图bipartite的概念 匹配的概念 最大匹配 bipartite matching 这个词最近在看Transformer相关的论文里常见用作loss function,所以特地学习一下,bipartite matching是一个什么操作。个人理解,若有表述错误或不当的问题,还请各位大…

【嵌入式单元测试】C语言单元测试框架搭建

cmocka cmocka交叉编译源码下载 编译准备源码修改指定编译器编译 cmocka使用示例常见问题参考 单元测试框架是一个软件包,它能够让开发者比较方便的表达产品代码需要表现出什么样的行为。单元测试框架提供了一个自动化单元测试的解决方案,让开发者把更多…

三年黑盒测试工程师,带你了解嵌入式测试,金三银四升职加薪秘诀

什么是嵌入式系统? 嵌入式系统是一种“完全嵌入受控器件内部,为特定应用而设计的专用计算机系统”。 嵌入式系统是“用于控制,监视或辅助操作机器和设备的装置”。 嵌入式系统还可以定义为“以应用为中心,以计算机技术为基础,软硬件可裁剪,功能、可靠性、成本、体积、功耗…

嵌入式软件测试的小结

文章内容为本人这三年来在嵌入式软件测试(黑盒)上的一些积累吧,说起来也挺快的,毕业三年的时间就这样过去了,在两家公司工作过(现在这家是第二家),这几年的测试项目基本都是围绕着嵌…

【测试】嵌入式软件测试VS一般软件测试

文章目录 1)什么是软件测试?测试的目的:软件测试的特点:软件测试信息流:软件测试的对象: 2)嵌入式软件测试2.1 嵌入式软件2.2 嵌入式软件测试嵌入式软件测试的特点: 3)嵌…