当前位置: 首页 > news >正文

Redis分布式锁实现基本概念

1-redis分布式锁

简答:我们通常使用 Redis 实现分布式锁,通过 SETNX + EXPIRE 保证原子获取锁,同时设置唯一UUID避免误删其他线程锁,释放锁时使用 Lua 脚本保证删除操作的原子性。生产项目一般使用 Redisson,它封装了锁续期、可重入锁、公平锁等能力。

1-1.set nx

SET key_name client_id NX PX 30000

NX:只有 Key 不存在时才设置成功(保证互斥)。

PX 30000:设置过期时间为 30 秒(防止节点宕机导致死锁)。

client_id:每个客户端生成唯一的随机 ID(如 UUID),用来标识“谁加的锁”。

1-2.Lua脚本-释放锁

lua脚本写法:

取出值,然后作比较,确定是自己创建自己删

ifredis.call('get',KEYS[1])==ARGV[1]thenreturnredis.call('del',KEYS[1])elsereturn0end

用这个脚本去读取,然后判断是不是现在这个方法生成的uuid,保证原子性,大致代码如下:

publicvoiddoBusiness(){StringlockKey="lock:order:123";Stringuuid=UUID.randomUUID().toString();// set nx,内部的值为uuidBooleansuccess=redisTemplate.opsForValue().setIfAbsent(lockKey,uuid,30,TimeUnit.SECONDS);if(Boolean.TRUE.equals(success)){try{// ===================// 业务代码// ===================createOrder();}finally{// 释放锁,用lua脚本releaseLock(lockKey,uuid);}}else{thrownewRuntimeException("系统繁忙,请稍后重试");}}

1-3.Redisson

现在有下列情况:

T0: 业务A执行 SETNX lock key_A EX 10(锁10秒过期) T1-T8: 业务A执行中... T10: 锁到期,Redis自动删除 key T11: 业务B执行 SETNX lock key_B EX 10 → 成功(拿到锁) T12: 业务A终于执行完了,执行Lua脚本删除锁

也就是业务A时间过长,导致锁自动过期删除,后续业务B看到没锁了,就创建key,正好业务A运行完了,去释放锁,导致业务B的key被删除了,我们用lua脚本,加上uuid的判断可以规避释放锁

// 业务A的代码if(setnx("lock",uuidA,10)){// 业务A以为有锁,开始执行// 假设这里执行了15秒...doSomeLongWork();// ← 第10秒时锁已经没了,但代码还在跑!// 第15秒执行完,尝试解锁delScript("lock",uuidA);// 失败,因为uuid不匹配}

但是A自己的业务在锁过期后还在运行,这会影响到数据一致性,此时我们需要续期,这个时候使用Redisson

1-3-2.续期

正常情况下,我们可以手动续期,但是一般企业会规范化使用Redisson

publicvoiddoBusiness(){// 1. 获取锁对象(Redisson 的锁)RLocklock=redissonClient.getLock("lock:order:123");try{// 2. 加锁(阻塞等待,直到获取到锁)lock.lock(30,TimeUnit.SECONDS);// 或者直接 lock(),使用默认30秒看门狗// 3. 执行业务createOrder();}catch(Exceptione){// 业务异常处理thrownewRuntimeException("业务执行失败",e);}finally{// 4. 释放锁lock.unlock();}}

PS:

  • 服务器宕机:因为redisson内部是隔一段时间就续个期,如果服务器宕机了,那么这个锁到期了也会释放,锁不会永久存在
  • 业务超时卡死:业务代码卡死,导致锁一直没释放,此时可以通过设置锁的最大时间规避,或者设置接口时间等等
http://www.jsqmd.com/news/1289724/

相关文章:

  • 2026上海考公机构测评:粉笔综合实力领先,AI系统与性价比构筑核心壁垒 - 天涯视角
  • 温控模块芯片工程批加工的关键技术挑战
  • RSpec测试报告生成:HTMLFormatter使用与自定义技巧
  • TEL 3M80-004459-Z2PCB 板组件
  • SM2国密算法实战指南:从原理到Node.js跨平台集成
  • 2026 年七夕海报用什么AI工具可以做?品牌运营实测3个高频场景 - 子柔传媒
  • 2026年电动车怎么托运最划算?这个方法省一半钱还不用拆电池 - 快递物流资讯
  • 无需下载软件,两步把两个PDF合二为一 - 软件工具教程方法
  • AI时代 最值得培养的能力是什么? -- 《吾辈如神》作者给出的10点建议
  • 超级电容用导电炭黑:原理、性能与技术添加
  • SkyChat高级玩法:自定义对话场景与多轮交互设计技巧
  • 2026年下半年防静电工服源头供应厂家综合评估 - 优企名品
  • 免费微信投票教程,3 分钟创建图片视频赛事投票活动 - 投票小程序
  • 2026年小间距LED技术解析:从封装工艺到智能控制的三维突破
  • 推广投产持续走低:拼多多代运营配套能力差异解读 - 羊城派
  • 在macOS上制作Windows启动盘的终极指南:WinDiskWriter完整教程
  • 2026上海公考机构实力横评:粉笔综合评分9.2分居首,AI系统与性价比构筑核心壁垒 - 天涯视角
  • 从0到1学习JTRevealSidebarDemo:iOS开发者必备的侧边栏实现方案
  • 做海报还在等设计排期?2026年七夕海报用什么AI工具可以做?6款工具横评 - 科技快讯
  • 2026 年新发布:苍溪正规的绿色芍药苗实力厂家选哪家,这种开花比叶子还仙的冷门植物,你竟还没入手?-昊宇园艺 - 行业甄选官
  • 无线安全研究者必备:EvilCrowRF-V2开发环境搭建与调试
  • 阳江公积金补缴公司口碑好排名实测:阳江服务机构榜单与挑选攻略 - 米諾
  • 深度剖析 AI 在电商行业的落地应用、瓶颈与发展机遇
  • 成都华阳天府新区一线装修公司靠谱甄选指南(2026 实用版) - 成都老鸟
  • gzx_dropdown_menu性能优化指南:提升App流畅度的5个方法
  • 2026.7.29
  • 终极家庭游戏串流指南:用Sunshine打造你的私人游戏云
  • 假期分享学习生活的第十四天
  • CircleType.js常见问题解答:从安装到高级配置全攻略
  • 2026 年现阶段郑州优秀的玻璃钢防腐瓦品牌有哪些,30年厂棚没漏雨,全靠这玩意儿顶住酸碱腐蚀?-利高防腐材料 - 行业严选官