【Redis分布式锁底层实现】

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

我是廖志伟,一名Java开发工程师、幕后大佬社区创始人、Java领域优质创作者、优快云博客专家。拥有多年一线研发经验,研究过各种常见框架及中间件的底层源码,对于大型分布式、微服务、三高架构(高性能、高并发、高可用)有过实践架构经验。

博主:java_wxid
社区:幕后大佬



本文的大概内容:

一、如何实现

redis使用setnx作为分布式锁,在多线程环境下面,只有一个线程会拿到这把锁,拿到锁的线程执行业务代码,执行业务代码需要一点时间,所以这段时间拒绝了很多等待获取锁的请求,直到有锁的线程最后释放掉锁,其他线程才能获取锁,这个就是redis的分布式锁的使用。

二、使用redis锁会有很多异常情况,如何处理这些异常呢

1.redis服务挂掉了,抛出异常了,锁不会被释放掉,新的请求无法进来,出现死锁问题

添加try finally处理

2.服务器果宕机了,导致锁不能被释放的现象

设置超时时间

3.锁的过期时间比业务执行时间短,会存在多个线程拥有同一把锁的现象

如果有一个线程执行需要15s,过期时间只有10s,当执行到10s时第二个线程进来拿到这把锁,会出现多个线程拿到同一把锁执行。

续期超时时间,当一个线程执行5s后对超时时间续期10s,续期设置可以借助redission工具,加锁成功,后台新开一个线程,每隔10秒检查是否还持有锁,如果持有则延长锁的时间,如果加锁失败一直循环(自旋)加锁。

4.锁的过期时间比业务执行时间短,锁永久失效

如果有一个线程执行需要15s,过期时间只有10s,当执行到10s时第二个线程进来拿到这把锁,会出现多个线程拿到同一把锁执行,在第一个线程执行完时会释放掉第二个线程的锁,以此类推,导致锁的永久失效。

给每个线程都设置一个唯一标识,避免出现程序执行的时间超过设置的过期时间,导致其他线程删除了自己的锁,只允许自己删除自己线程的锁

三、代码

/**
 * 分布式锁底层实现原理
 * @return
 */
@GetMapping("distributedLock")
public Object distributedLock(){
    String lockKey = "distributedLockKey";
    //给每个线程都设置一个唯一标识,避免出现程序执行的时间超过设置的过期时间,导致其他线程删除了自己的锁
    String clientId = UUID.randomUUID().toString();
    try {
        //添加过期时间保证线程运行到一半的时候,程序崩了,导致缓存中的key一直存在
        Boolean result = redisTemplate.opsForValue().setIfAbsent(lockKey, clientId, 30, TimeUnit.SECONDS);
        if (!result) {
            return "error_code";
        }
        // Todo 实现业务逻辑
        redisTemplate.opsForValue().set(TestConstant.KEY_TEST,String.valueOf(System.currentTimeMillis()));
    } finally {
        //判断是不是自己的线程删除自己的锁
        if (clientId.equals(redisTemplate.opsForValue().get(lockKey))) {
            redisTemplate.delete(lockKey);
        }
    }
    //Todo 当前代码未实现锁续命功能,锁续命功能:由于程序执行时间可能超过设置缓存中锁的过期时间,导致后续一部分业务未执行,一直被其他线程抢占,需要对锁进行续命,但是由于续命的时间不好确定,这个时候就需要单独开启子线程,定时任务不断的去判断当前锁,还在不在,如果不在了,说明业务已经执行完成了,如果还在,重新设置过期时间,一般而言,定时任务的时间为缓存设置的过期时间三分之一就可以了。
    return "end";
}

总结

以上就是今天要讲的内容,分布式锁保证了数据的准确性,但是减低了并发能力,同一个锁key,同一时间只能有一个客户端拿到锁,其他客户端会陷入无限的等待来尝试获取那个锁,只有获取到锁的客户端才能执行业务逻辑。还希望各位读者大大能够在评论区积极参与讨论,给文章提出一些宝贵的意见或者建议,合理的内容,我会采纳更新博文,重新分享给大家。


提示:以下都是资源分享,求个一键三连。

博客封面

首先我要说声抱歉,作为一个学习的平台,封面引人注目是营销策略,大家不用太过在意哈,专注博客内容本身即可。当然有同学惦记着我博客的封面,这里也分享出来给大家。
点击:博客封面
提取码:2021

面试资料

福利大放送,我就求个一键三连,拜托了,这对我真的很重要。
点击:面试资料
提取码:2021

200套PPT模板

福利大放送,我就求个一键三连,拜托了,这对我真的很重要。
点击:200套PPT模板
提取码:2021

提问的智慧

福利大放送,我就求个一键三连,拜托了,这对我真的很重要。
点击:提问的智慧
提取码:2021

一键三连

感谢大家的支持,用心写博文分享给大家,你的支持(点赞、收藏、关注)是对我创作的最大帮助。
微信公众号:南北踏尘
主页地址:java_wxid
社区地址:幕后大佬

给读者大大的话

我本身是一个很普通的程序员,放在人堆里,除了与生俱来的盛世美颜、所剩不多的发量,就剩下180的大高个了。就是我这样的一个人,默默坚持写博文也有好多年了,有句老话说的好,牛逼之前都是傻逼式的坚持。希望自己可以通过大量的作品,时间的积累,个人魅力、运气和时机,可以打造属于自己的技术影响力。同时也希望自己可以成为一个懂技术,懂业务,懂管理的综合型人才,作为项目架构路线的总设计师,掌控全局的团队大脑,技术团队中的绝对核心是我未来几年不断前进的目标。

点击关注博主

点击关注博主:幕后大佬
点击关注博主:java_wxid
点击关注社区:幕后大佬

Orcad原理图导入Allegro 在即将设计的PCB中,将层叠设置好后,执行File→import→parameters,将刚才导出的.prm文件导入,很多参数就自动设置好了,与已完成的PCB里的参数保持一致。具体操作是:在已完成的PCB里执行File→Exoprt→Parameters,弹出下图所示的对话框,选择需要导出的设计参数后,设置到导出路径,导出记录设计参数的文件(.prm)。在.brd文件导入网表后,往往需要页面大小、格点、各层叠里各要素显示颜色等参数,手动设置十分麻烦,我们可以在一块已经完成的PCB里导出记录设计参数的文件。 阅读详情

相关推荐

永磁同步电机控制笔记:foc控制原理通俗讲义

引言 到此为止,永磁同步电机控制相关文章已经写了7篇,其中simulink仿真系列文章5篇,控制笔记系列文章2篇,恍惚间感觉少了一篇概论,在此插入一篇,也算是对入坑电机控制一年半来的知识梳理。 文章目录引言一、同步电机是怎么转起来的二、什么样的旋转磁场效率最高三、怎么精准控制旋转磁场的方向四、怎样调节dq轴电流 一、同步电机是怎么转起来的 永磁同步电机结构如下: 外围是定子绕组,中间为永磁体,设...

搞电机的博客 2万+

3.2、Redis 分布式锁(底层原理)

Redlock 只有建立在「时钟正确」的前提下,才能正常工作,如果你可以保证这个前提,那么可以拿来使用。但是时钟偏移在现实中是存在的:第一,从硬件角度来说,时钟发生偏移是时有发生,无法避免。例如,CPU 温度、机器负载、芯片材料都是有可能导致时钟发生偏移的。第二,人为错误也是很难完全避免的。所以,Redlock尽量不用它,而且它的性能不如单机版 Redis,部署成本也高,优先考虑使用主从+ 哨兵的模式实现分布式锁(只会有很小的记录发生主从切换时的锁丢失问题)。

摸鱼喇手 836

AI 编程组合之deepseek+vscode+cline插件,使用deepseek大模型实现代码自动生成

本文介绍了VSCODE下cline插件的安装结合DeepSeek-V3,ai编程的组合套件,举了两个例子一个是生成登录页面,一个是生成贪吃蛇游戏

技术博客 7万+

基于 Redis 实现分布式锁的底层实现逻辑

基于 Redis 实现分布式锁的底层实现逻辑

gb4215287的博客 319

Python自动化办公:5分钟搞定钉钉群文件自动发送(附完整代码)

本文详细介绍了如何利用Python实现钉钉群文件的自动化发送。通过结合钉钉企业内部应用与群机器人API,构建了包含智能令牌管理、文件上传与消息发送的完整工作流。文章提供了可直接复用的完整代码,并分享了定时任务、目录监听等进阶实战方案,帮助职场人士高效解决重复性文件发送难题,实现办公自动化。

7z8x2c4v6b9的博客 321

从315MHz到125kHz:手把手教你用Arduino模拟汽车钥匙的RKE/PKE信号(附代码)

本文详细介绍了如何使用Arduino开发板和射频模块模拟汽车钥匙的RKE/PKE信号,包括硬件准备、代码实现和安全机制。通过实践教程,读者可以深入理解315MHz和125kHz信号在汽车电子领域的应用,掌握无钥匙进入系统的核心技术。

weixin_30945039的博客 223

Redis 分布式锁底层是如何实现的?

1.首先利用 setnx 来保证:如果 key 不存在才能获取到锁,如果 key 存在,则获取不到锁 2.然后还要利用 lua 脚本来保证多个 redis 操作的原子性 3.同时还要考虑到锁过期,所以需要额外的一个看门狗定时任务来监听锁是否需要续约 4.同时还要考虑到 redis 节点挂掉后的情况,所以需要采用红锁的方式来同时向 N /2+1个节点申请锁,都申请到了才证明获取锁成功,这样就算其中某个 redis 节点挂掉了,锁也不能被其他客户端获取到

lcb1424556301的博客 268

通信系统原理[郭宇春]——模拟调制系统——课后习题答案

通信系统原理[郭宇春]——第三章课后习题答案,出错望指正!

尧呱呱的博客 3844

Redis分布式锁的实现方式及底层原理

在加锁方法中,我们首先生成了一个随机字符串nonce作为锁的值,并在每个Redis实例上进行原子性的set操作,返回成功加锁的实例数。如果获取到锁的实例数大于等于quorum(即多数节点),并且加锁操作完成的时间小于锁的过期时间expireTime,则表示加锁成功,否则认为加锁失败,触发重试机制。Redlock算法采用多个节点之间互斥的方式获取分布式锁,可以保证在大部分节点正常情况下分布式锁的可靠性,并允许在某些更繁忙或网络质量较差的节点上失败,从而确保分布式锁的稳定性。

青山师 1708

Transformer实战(1)——词嵌入技术详解

词嵌入的核心思想是,通过将词语表示为稠密的向量,使得计算机可以更有效地处理和理解文本中的语义关系。在本节中,我们学习了单词分布式表示的概念及其实现,包括静态嵌入和动态嵌入,实现了 Word2Vec 和 GloVe 模型,并介绍了如何使用 Gensim API 探索嵌入空间。

盼小辉丶的博客 1万+

YOLOv11改进策略【损失函数篇】| arXiv2025 TeLU双曲正切指数线性单元 强梯度防消失 + 解析光滑稳训练,极速提升收敛与泛化

本文记录的是。TeLU(Hyperbolic Tangent Exponential Linear Unit)通过。本文利用TeLU激活函数,以x⋅tanhex统一实现正区间强梯度加速收敛与负区间持续梯度避免死神经元,全程保持解析光滑与极低计算开销,,显著提升深度网络在分类、检测、分割、时序任务中的收敛速度、精度与泛化鲁棒性。

Limiiiing的博客 224

五、Redis底层原理 - 分布式锁

redis分布式锁

ALLWE的博客 1221

手把手教你学Simulink——光伏储能系统双向DC-AC逆变器恒功率控制(PQ控制)仿真

本文详细介绍了光伏储能系统中双向DC-AC逆变器的恒功率控制(PQ控制)仿真方法。主要内容包括:1)PQ控制原理及其在光伏满发和储能充放电中的应用;2)系统架构设计,重点推导了功率到dq电流的数学映射关系及电流内环控制算法;3)Simulink建模步骤,涵盖功率电路搭建、PLL设计、电流参考转换等关键环节;4)仿真结果分析,验证了系统在10kW光伏满发和-5kW储能充电模式下的稳态精度和动态切换性能;5)工程实践建议,包括数字控制延迟补偿、低电压穿越处理等实际问题解决方案。该指南为新能源并网系统的功率精准控

MHD0815的博客 424

Redis中的分布式锁之SETNX底层实现

Redis分布式锁SETNX实现原理详解 本文深入分析了Redis中SETNX命令实现分布式锁的核心机制。首先通过餐厅点菜的类比场景,形象说明了分布式锁的必要性。随后详细解析了SETNX的执行流程,包括原子性检查键是否存在和设置键值的过程,以及配合EXPIRE命令防止死锁的安全实践。 文章重点剖析了SETNX的底层技术原理,包括Redis字典数据结构、渐进式rehash机制和内存管理策略。通过源码片段展示了Redis处理SETNX命令的核心逻辑,并强调分布式锁实现中的关键安全考量因素。 最后总结了SETNX

从不水文,坚持创作,加油 1148

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Redis分布式锁中Redission底层实现

Redis分布式锁的Redission实现原理与应用 摘要:本文深入分析了Redis分布式锁中Redission客户端的底层实现机制。Redission通过SET NX PX命令获取锁,并引入看门狗机制定期续期,确保锁的可靠性。其核心实现包含Lua脚本保证原子性、可重入锁设计以及完善的异常处理。与简单SETNX相比,Redission提供了更完备的分布式锁功能,包括锁等待、自动续期和释放通知等特性。文章详细介绍了Redission分布式锁的使用方法、技术原理和最佳实践,同时对比了与其他分布式锁方案的差异。R

从不水文,坚持创作,加油 1346

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Redis分布式锁底层是如何实现的?

首先利用setnx来保证:如果key不存在才能获取到锁,如果key存在,则获取不到锁然后还要利⽤lua脚本来保证多个redis操作的原⼦性同时还要考虑到锁过期,所以需要额外的⼀个看⻔狗定时任务来监听锁是否需要续约同时还要考虑到redis节点挂掉后的情况,所以需要采⽤红锁的⽅式来同时向N/2+1个节点申请锁, 都申请到了才证明获取锁成功,这样就算其中某个redis节点挂掉了,锁也不能被其他客户端获取到。

完全体 843

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Redisson实现Redis分布式锁的底层原理

一、写在前面 二、Redisson实现Redis分布式锁的底层原理 (1)加锁机制 (2)锁互斥机制 (3)watch dog自动延期机制 (4)可重入加锁机制 (5)锁释放机制 (6)此种方案Redis分布式锁的缺陷 三、未完待续 一、写在前面 现在面试,一般都会聊聊分布式系统这块的东西。通常面试官都会从服务框架(Spring Cloud、Dubbo)聊起,一路聊到分布式事务、分布式锁、ZooKeeper等知识。所...

1 416

Redis 分布式锁的底层实现原理详解

SETNXSETNX是 Redis 的一个命令,全称为 “SET if Not eXists”。它的作用是在键不存在时创建键,并设置其值。SETNX的返回结果是一个布尔值,成功创建返回1,如果键已经存在,则返回0。EXPIREEXPIRE是 Redis 的另一个命令,用于为键设置过期时间。当过期时间到达时,键会自动删除。

lssffy的博客 1840

redis:Redisson实现Redis分布式锁的底层原理

!!项目里面使用了这段代码,之前面试的时候问过是什么原理,我原先以为是底层执行了setnx,今天看了下源码发现不是,所以查了下。

qq_41364834的博客 105

Redis底层原理 (Redis实现分布式锁)(八)

业务场景 防止用户重复下单 MQ消息去重 订单操作变更 库存超卖 分析: 业务场景共性: 共享资源:用户id、订单id、商品id。。。解决方案 共享资源互斥 共享资源串行化 问题转化 锁的问题 (将需求抽象后得到问题的本质) 锁应用 单应用中使用锁:(单进程多线程)synchronized、ReentrantLock 分布式应用中使用锁:(多进程...

最近学习目标:MySQL,Redis 798

Redis分布式锁的底层实现原理

如果Redis本身是集群的,那么在加锁时就需要在整个集群中加成功,不然只在一个节点上加成功了,那么另外的客户端在其它节点也加成功了,这就达不到加锁的效果。比如RedLock的思想是,加锁时在多个节点同时加,只要超过一半的节点返回加锁成功,才表示分布式锁加成功了。比如通过setnx k v命令来实现加锁,并且需要给key指定一个超时时间以防止死锁,另外v可以为uuid,这样在删除k,也就是释放锁的时候,可以判断一下当前要删除的锁是不是自己所加的,从而避免误删除,同时也需要利用lua脚本来保证原子性。

weixin_63653446的博客 225

【面试题】Redisson实现Redis分布式锁的底层原理

使用Lua脚本就可以解决这个问题,我们可以在Lua脚本中先判断锁(key)是否存在,如果存在则再判断持有这把锁的线程是否是当前线程,如果不是则加锁失败,否则当前线程再次持有这把锁,并把锁的重入次数+1。正常来说,如果线程1通过get操作从Redis中得到的value是123,那么就会执行删除锁的操作,但假如在执行删除锁的动作之前,系统卡顿了几秒钟,恰好在这几秒钟内,key自动过期了,线程2就顺利获取到锁开始执行自己的逻辑了,此时,线程1卡顿恢复了,开始继续执行删除锁的动作,那么此时删除的还是线程2的锁。

yzx3105的博客 1326
上一篇: HTML爱的表白:教你用代码送上浪漫玫瑰花
下一篇: 【HashMap底层运行原理】
Java程序员廖志伟
Java程序员廖志伟 优质创作者: Java技术领域 优质创作者: Java技术领域 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄8年 2万+粉丝 1902原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java程序员廖志伟

赏我包辣条呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值