redis 分布式锁遇到的坑

基于Redis实现分布式锁之前,这些坑你一定得知道 作者简介 陈寒立,一个不误正业的程序员。先后在物流金融组、物流末端业务组和压力平衡组打过杂,技术栈从Python玩到了Java,依然没学会好好写业务代码,梦想着用抽象的模型拯救业务于水火之中。 开头 基于Redis的分布式锁对大家来说并不陌生,可是你的分布式锁有失败的时候吗?在失败的时候可曾怀疑过你在用的分布式锁真的靠谱吗?以下是结合自己的踩坑经验总结的一些经验之谈。 你真的需要分布式锁吗? ... 阅读详情

用锁遇到过哪些问题?又是如何解决的?

未关闭资源

由于当前线程 获取到redis 锁,处理完业务后未及时释放锁,导致其它线程会一直尝试获取锁阻塞,例如:用Jedis客户端会报如下的错误信息

1redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
redis线程池已经没有空闲线程来处理客户端命令。使用原生方法记得关闭!

解决的方法也很简单,只要我们细心一点,拿到锁的线程处理完业务及时释放锁

B的锁被A给释放了

我们知道Redis实现锁的原理在于 SETNX命令。当 key不存在时将 key的值设为 value ,返回值为 1;若给定的 key已经存在,则 SETNX不做任何动作,返回值为 0 。

SETNX key value

我们来设想一下这个场景:A、B两个线程来尝试给key myLock加锁,A线程先拿到锁(假如锁3秒后过期),B线程就在等待尝试获取锁,到这一点毛病没有。

那如果此时业务逻辑比较耗时,执行时间已经超过redis锁过期时间,这时A线程的锁自动释放(删除key),B线程检测到myLock这个key不存在,执行 SETNX命令也拿到了锁。

但是,此时A线程执行完业务逻辑之后,还是会去释放锁(删除key),这就导致B线程的锁被A线程给释放了。

为避免上边的情况,一般我们在每个线程加锁时要带上自己独有的value值来标识,只释放指定value的key,否则就会出现释放锁混乱的场景

一般我们可以设置value为业务前缀_当前线程ID或者uuid,只有当前value相同的才可以释放锁

锁过期了,业务还没执行完

redis分布式锁过期,而业务逻辑没执行完的场景,不过,这里换一种思路想问题,把redis锁的过期时间再弄长点不就解决了吗?

那还是有问题,我们可以在加锁的时候,手动调长redis锁的过期时间,可这个时间多长合适?业务逻辑的执行时间是不可控的,调的过长又会影响操作性能。

要是redis锁的过期时间能够自动续期就好了。

为了解决这个问题我们使用redis客户端redisson,redisson很好的解决了redis在分布式环境下的一些棘手问题,它的宗旨就是让使用者减少对Redis的关注,将更多精力用在处理业务逻辑上。

redisson对分布式锁做了很好封装,只需调用API即可。

1  RLock lock = redissonClient.getLock("stockLock");

redisson在加锁成功后,会注册一个定时任务监听这个锁,每隔10秒就去查看这个锁,如果还持有锁,就对过期时间进行续期。默认过期时间30秒。这个机制也被叫做:“看门狗”

redis主从复制的坑

redis高可用最常见的方案就是主从复制(master-slave),这种模式也给redis分布式锁挖了一坑。

redis cluster集群环境下,假如现在A客户端想要加锁,它会根据路由规则选择一台master节点写入key mylock,在加锁成功后,master节点会把key异步复制给对应的slave节点。

如果此时redis master节点宕机从节点复制失败,为保证集群可用性,会进行主备切换,slave变为了redis master。B客户端在新的master节点上加锁成功,而A客户端也以为自己还是成功加了锁的。另外如果主从复制延迟同样也会造成加锁和解锁延迟的问题。

此时就会导致同一时间内多个客户端对一个分布式锁完成了加锁,导致各种脏数据的产生。

至于解决办法嘛,目前看还没有什么根治的方法,只能尽量保证机器的稳定性,减少发生此事件的概率,即便是redis作者也没有特别完美的解决这个问题,参考我的另一篇:Redlock:Redis集群分布式锁

https://blog.youkuaiyun.com/zjcjava/article/details/103025997

毕竟redis是保持的AP而非CP,如果要追求强一致性可以使用zookeeper分布式锁

在这里插入图片描述

【安全设备篇】HVV面试专题 还有就是这个可能是被访问的这个内网系统,本身业务系统存在业务逻辑问题,因为内网所布置的很多业务系统往往不会考虑一些安全性问题,比如在正常的业务逻辑请求中直接带了sql语句,就会触发设备规则产生告警,这一类是属于误报,然后会将此告警上报给研判人员,需要研判组专家和甲方客户确认下是否是该系统存在此业务逻辑问题,并且需要确认告警的源ip在此告警的时间段附近有没有进行操作过。天眼日志分析主要基于系统和应用程序的日志数据来识别安全威胁,而威胁感知则通过收集和分析多种来源的情报信息。理解威胁的性质和威胁背后的原理。 阅读详情

相关推荐

洛谷P5707 【深基2.例12】上学迟到(c语言)

第一篇题解 题目描述 yyy 的学校要求早上 8 点前到达。学校到 yyy 的家一共有 s(s\le 10000)s(s≤10000) 米,而 yyy 可以以 v(v<10000)v(v<10000) 米每分钟的速度匀速走到学校。此外在上学路上它还要额外花 10 分钟时间进行垃圾分类。请问为了避免迟到 yyy 最晚什么时候出门?输出 HH:MM 的时间格式,不足两位时补零。由于路途遥远, yyy 可能不得不提前一天出发,不过不可能提前超过一天。 输入格式 两个正整数 s,v,意思已经在题目中给定

cc_love_program的博客 1万+

Redis——》锁被别人释放

SET lock_key 1 EX 10 NX // 10s后自动过期 执行以上命令,给锁加自动过期时间,但每个客户端在释放锁时,都是无脑操作,并没有检查这把锁是否还归自己持有,所以就会发生释放别人锁的风险。

小仙~ 852

AI编程工具选哪个更高效?开发者深度评测

无论是代码生成、错误修复,还是架构设计,AI都能提供强大的辅助能力。然而,市面上AI编程工具众多,如何选择最适合自己的?本文将从代码质量、响应速度、多语言支持、集成能力等多个维度,为你解析2025年最主流的几款AI编程工具,帮助你做出更高效的选择。根据2025年最新调研数据,全球超过85%的开发者正在使用AI编程工具辅助开发,相比2023年增长了近40%。合理利用AI,能让你的开发效率提升数倍,但真正的核心竞争力,仍然在于你的编程思维和解决问题的能力。:技术较强的开发者、重视数据隐私的企业。

1853

Redis锁被别人释放怎么办

什么是分布式锁?要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁、进程锁。线程锁:主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁...

zls365365的博客 737

在 Linux 虚拟机中手动安装 VMware Tools

对于 Linux 虚拟机,您可以从命令行手动安装 VMware Tools。对于 Linux 的较高发行版,请使用集成的 open-vm-tools 版本。 前提条件 有关 open-vm-tools 的操作系统兼容性的详细信息,请参见《VMware 兼容性指南》,网址为VMware Compatibility Guide - System Search。 开启虚拟机。 确认客户机操作系统正在运行。 因为 VMware Tools 安装程序是使用 Perl 编写的,请确认已在客户机操作系统中安..

m0_62526815的博客 1755

【Linux0.11代码分析】之 系列文章链接汇总(全)

【Linux0.11代码分析】00 之 系列文章链接汇总(全)

|~~~热爱生活、努力学习的小伙汁~~~| 1449

Redisson源码-多线程之首个获取锁的线程加解锁流程

Redisson源码-单线程加解锁流程

zh123456_789的博客 1599

模型训练篇 | 手把手教你使用ResNet训练自己数据集和推理,ResNet50通用物体分类识别,含完整代码和数据集,全网最详细教程

手把手教你使用ResNet训练自己数据集和推理,ResNet50通用物体分类识别,含完整代码和数据集,全网最详细教程。本篇文章将带你学习 ResNet50 模型构建、ResNet50训练自己数据集、数据集处理、推理和验证、模型剪枝与模型改进等。 本篇教程适配各种分类识别任务,可以说是一个通用的教程,只需修改自己的数据集即可完成自己领域的任务和系统实现。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 719

Redis实现分布式锁的原理:常见问题解析及解决方案、源码解析Redisson的使用

介绍Redis实现分布式锁的原理、常见问题解析与解决方案、源码解析Redisson的使用

qurious7的博客 3719

AEJoy —— 表达式之仅限在某一维摆动【JS】

效果图 wiggle() 的作用仅限于水平方向 想法 wiggle() 确实是一个非常方便的工具,但有时您希望对它有更多的控制。在本例中,我们希望仅将摆动限制在水平方向。 设计 要理解 wiggle() 最重要的一点是,它生成的结果与应用它的属性具有相同的维度。例如,如果你将 wiggle() 应用于 3D 层的 position 属性,结果将是一个由三个元素组成的数组(x、y 和 z 各一个)。我们需要做的就是将 wiggle() 的结果捕捉到一个变量(我们称之为 “w” ),然后从这个变量中提取我们想

ShaderJoy 的兴趣技术杂货铺 2094

【DevOps】rancher集成ldap,实现统一账号登录

登录到rancher控制台,选择【安全】-【认证】 选择【OpenLDAP】 其中【搜索起点】需要去ldap界面查配置完成

CN_Eden 1092

redis分布式锁解决方案

一、什么是分布式锁? 线程锁:主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比如synchronized是共享对象头,显示锁Lock是共享某个变量(state) 进程锁:为了控制同一操作系统中多个进程访问某个共享资源,因为进程具有独立性,各个进程无法访问其他进程的资源,因此无法通过synchronized等线程锁实现进程锁。 分布式锁:当多个进程不在同一个系统中,用分布式.

weixin_43123066的博客 5095

第10章: MMU notifier与HMM的协作

本文摘要: HMM(Heterogeneous Memory Management)是Linux内核提供的异构内存管理框架,用于统一CPU与设备(如GPU、DSP等)的内存访问。它通过镜像页表技术实现虚拟地址空间共享,自动同步CPU和设备页表变化,支持透明的内存迁移和设备内存管理。HMM构建在mmu_interval_notifier机制上,利用序列号检测页表修改冲突,提供高效并发控制。核心数据结构包括hmm_range和HMM PFN标志位,通过hmm_range_fault()实现页表遍历和缺页处理。

图形/计算GPU的驱动与虚拟化技术分享园地 3088

Redis分布式锁的10个坑

方法之前开启事务,之后再加锁,当锁住的代码执行完成后,再提交事务,因此锁住的代码块执行是在事务之内执行的,可以推断在代码块执行完时,事务还未提交,锁已经被释放,此时其他线程拿到锁之后进行锁住的代码块,读取的库存数据不是最新的。,就是当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,会阻塞,不可以再次获得锁。代码块,即在宕机前,锁并没有被删除掉,这样的话,就没办法保证解锁,所以这里需要给。过来了,它就能抢到锁了,开始执行它的业务逻辑,恰好这时,线程。这样程序不高效,应当每次处理完业务逻辑,

a657281084的博客 81

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

redis分布式锁实现和坑点及zookpeer分布式锁实现和坑点

redis分布式锁基于setnx实现的坑点: redis基于redission实现原理:

BOUBING112的专栏 378

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

redis 分布式锁的 5个坑,真是又大又深

redis 分布式锁的 5个坑,真是又大又深

qq_41490913的博客 424

计算机控制技术及应用

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

从秒杀系统到分布式锁:Redis+Redisson完美方案避坑指南

本文将从实际秒杀场景出发,逐步剖析分布式锁的技术演进,详细介绍Redis分布式锁的7大坑点及Redisson的最佳实践方案。包含10+个代码示例,覆盖单机锁到分布式锁的技术跃迁过程,最后给出生产环境中的性能优化建议。技术选型建议中小规模:Redisson单节点锁高可用场景:RedLock+至少3个主节点极端一致性:考虑Zookeeper方案与Spring Cloud整合的声明式锁基于RSocket的响应式锁实现Serverless环境下的无状态锁方案。

龚小帅的博客 485

Redis100篇 - 用Redis实现分布式锁 完整代码+避坑指南

Redis分布式锁实现指南 本文介绍了使用Redis实现分布式锁的完整方案,从基础概念到工业级实现。主要内容包括: 核心概念:分布式锁需满足互斥性、避免死锁、可重入性、高性能和高可用性要求,以解决电商秒杀等场景的并发问题。 实现演进: 基础版:使用SETNX命令,但存在死锁风险 改进版:利用SET命令的NX和EX选项实现原子操作 安全版:通过唯一标识和Lua脚本确保锁的正确释放 关键代码: 原子性加锁:setIfAbsent(key, value, expireTime, TimeUnit.SECONDS)

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

从扣减库存场景来讲讲redis分布式锁中的那些“坑”

在文章的开始前,我们先来看一段代码:1.2.3.4.5.6.7.8.9.10.11.12.13.14.15. 代码的逻辑很简单,就是从redis里拿到一个key为stock的键值对,然后判断其值在大于0的情况下进行减一操作,之后再将这个键值对重新存储,这里模拟的是下单减商品库存这么一个场景。虽然代码逻辑很简单,乍一看也没什么问题,但相信聪明的读者已经想到了在高并发场景下可能存在的问题:在短时间内突然大量的请求这个接口,假如有3个请求同时执行到取键值对并进行了扣减库存,那么此时实际上库存是-3,但这3个请求是

weixin_43932886的博客 1031

记一次由Redis分布式锁造成的重大事故,避免以后踩坑!

记一次由Redis分布式锁造成的重大事故,避免以后踩坑!

qq_41490913的博客 180

redis分布式锁的五个坑

redis分布式锁在实际开发过程中的重要性,不言而喻,设计高并发的业务场景,redis几乎都会登场。 今天给大家分享一下redis分布式锁的几大坑吧???? 1、锁未被释放 请看下面一段代码 1 /** 2 * @author xiaofu 3 * @description 扣减库存 4 * @date 2020/4/21 12:10 5 */ 6 public String stockLock() { 7 RLock lock = red

theRengar的博客 391

避开这些坑,你能更好的创建一个基于Redis分布式锁

基于Redis的分布式锁对大家来说并不陌生,可是你的分布式锁有失败的时候吗?在失败的时候可曾怀疑过你在用的分布式锁真的靠谱吗?以下是结合自己的踩坑经验总结的一些经验之谈。

Java_LingFeng的博客 129

Redis作为分布式锁,得会避坑

Redis 作为分布式锁 的 开发场景是很常见的,所以做好避坑工作,道路千万条,安全第一条,行车不规范,亲人两行泪!

码刀攻城 1824
上一篇: 使用 Spring Cache + Redis 作为缓存并支持自定义单个key设置过期时长
下一篇: Scala 安装
牧竹子
博客等级 码龄17年 572粉丝 233原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值