Redis分布式锁解决多进程/多线程下单个进程/单个线程运行

Redis分布式锁解决多进程/多线程下单个进程/单个线程运行

作者:lightcity 2021-09-10 21:25:43

存储

存储软件

分布式

Redis 最近,有两台容器,当程序运行时,会发送多份通知,那么需要保证同一时刻只有一个进程(一台容器)来运行,此时用分布式锁解决该问题。

[[423225]]

1.导语

在业务开发中像订单写入,一般需要单线程来保证订单写入数据库,防止数据多次被插入。

最近,有两台容器,当程序运行时,会发送多份通知,那么需要保证同一时刻只有一个进程(一台容器)来运行,此时用分布式锁解决该问题。

业界也有许多解决这种方案,这里以redis分布式锁来解决。

简单来说就是采用golang redis库实现下面方案即可。

2.redis的分布式锁实现

2.1 setnx+expire

setnx key value,将key设置为value,当键不存在时,才能成功,若键存在,什么也不做,成功返回1,失败返回0。

SETNX实际上就是SET IF NOT Exists的缩写。

 

  1. setnx key val 
  2. expire key seconds 

但是,上述两个操作不具有原子性,如果执行完第一条指令应用异常或者重启了,锁将无法过期。

2.2 lua脚本

既然是原子性无法保证,那就采用执行lua脚本的原子性,将上述两个操作封装到lua脚本中便可以实现。

 

  1. if redis.call('setnx',KEYS[1],ARGV[1]) == 1 then 
  2.    redis.call('expire',KEYS[1],ARGV[2]) 
  3. else 
  4.    return 0 
  5. end

2.3 携带TTL的set

从 Redis 2.6.12 版本开始, SET 命令的行为可以通过一系列参数来修改。

 

  1. SET key value [EX seconds]  
  2. [PX milliseconds] [NX|XX] 

将字符串值 value 关联到 key 。

如果 key 已经持有其他值, SET 就覆写旧值,无视类型。

对于某个原本带有生存时间(TTL)的键来说, 当 SET 命令成功在这个键上执行时, 这个键原有的 TTL 将被清除。

  • EX second :设置键的过期时间为 second 秒。SET key value EX second 效果等同于 SETEX key second value 。
  • PX millisecond :设置键的过期时间为 millisecond 毫秒。SET key value PX millisecond 效果等同于 PSETEX key millisecond value 。
  • NX :只在键不存在时,才对键进行设置操作。SET key value NX 效果等同于 SETNX key value 。
  • XX :只在键已经存在时,才对键进行设置操作。

直接使用可能存在如下问题:

  • 超时解锁导致并发

例如:如果线程 A 成功获取锁并设置过期时间 30 秒,但线程 A 执行时间超过了 30 秒,锁过期自动释放,此时线程 B 获取到了锁,线程 A 和线程 B 并发执行。

A、B 两个线程发生并发显然是不被允许的,一般有两种方式解决该问题:

解决方案:1)确保代码在过期时间之前释放。2)为获取锁的线程增加守护线程,为将要过期但未释放的锁增加有效时间。

锁被别的线程误删除。

例如:如果线程 A 成功获取到了锁,并且设置了过期时间 30 秒,但线程 A 执行时间超过了 30 秒,锁过期自动释放,此时线程 B 获取到了锁;随后 A 执行完成,线程 A 使用 DEL 命令来释放锁,但此时线程 B 加的锁还没有执行完成,线程 A 实际释放的线程 B 加的锁。

解决方案是:通过在 value 中设置当前线程加锁的标识,在删除之前验证 key 对应的 value 判断锁是否是当前线程持有。可生成一个 UUID 标识当前线程,使用 lua 脚本做验证标识和解锁操作。

学习文章:

https://xiaomi-info.github.io/2019/12/17/redis-distributed-lock/

https://zhuanlan.zhihu.com/p/115848078

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/273614.html<

(0)
运维的头像运维
上一篇2025-05-09 08:41
下一篇 2025-05-09 08:42

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注