如何避免redis分布式锁失效

Redis分布式锁在集群故障切换时如何避免锁失效? 在Redis集群环境中,主从切换时可能因异步复制导致分布式锁失效(如主节点写入锁后未同步即宕机,新主节点无锁数据),破坏互斥性。 阅读详情

✅ 一、分布式锁基本模型

目标: 保证在分布式系统中,一个共享资源(如订单创建)在任意时间只被一个客户端操作。

通用 Redis 锁结构:

SET lock_key client_id NX EX 30

  • NX:只在 key 不存在时设置

  • EX:设置过期时间,防止死锁

  • client_id:唯一标识持锁客户端

风险点:

  • 锁因业务执行时间过长而过期(Redis TTL机制)

  • 锁 key 被 Redis 内存淘汰机制清除

  • 多个客户端因锁失效并发执行(锁竞争穿透)

  • 因宕机导致死锁或事务未完成


✅ 二、Redis 过期/内存淘汰导致锁失效的根本原因

问题类型背后原理影响
TTL 过期Redis 设置的 expire 计时器触发,自动删除 key锁提前释放,任务仍在执行
内存淘汰Redis 内存满,启用 maxmemory-policy,优先回收 TTL 或 LRU/LFU 的 key锁 key 被非预期回收
主从不一致主节点写入但还未同步,宕机切换到从节点锁“未曾存在”,导致另一个客户端获取锁

✅ 三、从架构角度的系统性对策

1. 锁机制应有  租约续约(Lease + Heartbeat)能力

原理: 锁的 TTL 应该是「软 TTL」,可通过“看门狗”机制自动续期,避免 TTL 到期导致锁被 Redis 删除。

✅ 实践方案
  • 使用 Redisson 的 WatchDog 自动续期机制

    //示例代码(Redisson)
    RLock lock = redissonClient.getLock("lock:order:123");
    
    boolean locked = lock.tryLock(5, 30, TimeUnit.SECONDS); // 尝试加锁 + 锁有效期
    
    try {
        if (locked) {
            // 临界区逻辑
        }
    } finally {
        lock.unlock(); // 原子校验 + 自动释放
    }
  • 或者手动实现一个 定时续期线程(仅续自己持有的锁)

架构设计视角
  • 每个服务节点获取锁时,启动一个守护线程每隔 N 秒检查锁是否仍然是自己持有

  • 是 → 执行 expire 重置 TTL

  • 否 → 自动退出续约线程

类似数据库的租约机制,避免“锁饿死”。


2. 锁 key 应不受 Redis 淘汰策略影响(锁隔离区设计)

原理: Redis 的 volatile-ttl, allkeys-lru, allkeys-random 策略会淘汰掉 key,即使 TTL 还没到。

✅ 实践方案
  • 将 锁 key 置于专用 DB,如 Redis 的 DB 15,避免与缓存等共享

  • Redis 实例设定 maxmemory-policy = noeviction 或仅淘汰热点缓存空间

  • 为锁 key 使用命名前缀如 lock:xxx,统一监控/隔离

  • Redis 实例内存配置预留充足空间避免触发淘汰

架构设计视角

锁是“系统控制数据”而不是业务缓存,必须具备高可靠性。

因此应隔离缓存与锁数据,避免因缓存压力影响锁行为。


3. 锁释放需原子校验 owner 身份,防止误删

原理: 客户端持有锁后宕机,另一个客户端获取了锁,结果前一个客户端重启并释放了锁,导致锁被错误释放。

✅ 实践方案

使用 Lua 脚本校验并释放:

if redis.call("get", KEYS[1]) == ARGV[1] then

    return redis.call("del", KEYS[1])

else

    return 0

end

  • 只有持有者能释放锁

  • 提供事务性、原子性保障

架构设计视角
  • 锁释放必须做到幂等、可审计、可验证(owner 校验 = 数据版本号控制)

  • 类似数据库乐观锁机制


4. Redis 单点/主从复制延迟引发的锁漂移问题

原理: Redis 主从复制是异步的。主节点设置了锁还没同步到从节点,主挂了,从提升为主,另一个客户端就能加锁了。

✅ 实践方案
  • 使用 RedLock 算法(多个 Redis 实例,大多数节点成功加锁才视为成功)

  • 或使用 CP 系统(如 ZooKeeper、etcd)进行分布式协调

5. 补偿机制:防止“锁过期 + 数据未提交”造成数据不一致

方案:
✅ 5.1 业务幂等性设计
  • 保证相同请求多次执行,结果一致

  • 数据表中使用唯一请求号或业务标识控制

✅ 5.2 事务完成后再释放锁
@Transactional
public void doTaskWithLock() {
    RLock lock = redissonClient.getLock("task:lock");

    if (lock.tryLock(10, TimeUnit.SECONDS)) {
        try {
            // 1. 数据库事务操作(如写入状态表)
            // 2. 推送消息、写入缓存等
        } finally {
            lock.unlock(); // 保证释放锁时业务已完成
        }
    }
}
✅ 5.3 定期审计未完成任务
  • 宕机恢复后,检查“任务日志表”中未完成的数据

  • 执行补偿逻辑(重新调度、回滚、告警)


✅ 6. 事务状态持久化设计

原理:
  • 加锁后即刻将「执行中」状态持久化(写入数据库或任务表)

  • 即使宕机后,也能知道该操作“未完成”,由后续任务修复

示例任务状态表:
任务ID状态锁持有者ID创建时间更新时间
T123PROCESSINGsvc-A2025-07-19 15:00NULL

方便另一个实例获取锁后根据状态判断是否重试、回滚或跳过

架构设计视角
场景优先方案
本地部署、小集群、高性能要求Redisson 单节点锁 + WatchDog
多机房、强一致、关键任务ZooKeeper/Etcd 等 CP 分布式协调系统


✅ 四、锁系统设计原则

设计原则说明
最小职责分布式锁只控制互斥,不负责状态传递、数据同步
可观测性所有加锁/续约/释放操作要有监控(如 lock stats、失败率、owner trace)
高可用性锁系统本身不应成为单点,可使用 Redis Sentinel 或 Redis Cluster
可回退性锁失败应快速回退、重试、或降级(防雪崩)
隔离性锁与业务缓存分离,避免资源争抢影响系统可用性


✅ 建议

设计点建议
锁续约Redisson WatchDog 或手动续期
锁 key 管理独立 Redis DB + 前缀命名 + 不参与淘汰策略
锁释放Lua 原子释放 + client_id 绑定
Redis 容灾RedLock 或 CP 系统(ZK、Etcd)
监控监控锁持有者、TTL、失败率、获取时延、释放延迟等

可靠性保障:

目标推荐实践
防止死锁设置锁 TTL + WatchDog 自动续约
防止误释放使用 UUID + Lua 脚本校验
防止业务未完成锁就释放锁释放前完成事务 + 状态持久化
防止宕机后数据不一致幂等机制 + 任务补偿机制
保证系统容灾Redis 高可用 + 持久化配置
GeoScene Pro教程(002):GeoScenePro基础操作 GeoScenePro基础操作介绍。 阅读详情

相关推荐

宇树G1嵌入式软件架构及技术实现

该架构通过硬件加速(FPGA)+确定性调度(RTX5)的组合,在1ms控制周期内完成从传感器采集到43轴输出的全链路处理,相比波士顿动力系统缩短40%的着地稳定时间。,结合ARM Cortex-R5与FPGA的异构计算能力,实现43自由度1kHz实时控制。

m0_60674045的博客 4310

Redis——》死锁

已经获得锁的客户端一直占用锁,其他客户端永远无法获取到锁,这就是死锁

小仙~ 2364

Phantom Omni的力与力矩操作

*本说明为对Phantom Omni的力与力矩操作 ****************虚拟夹具的力读取与控制************************ 1、首先力的读取要声明【全局变量】 hduVector3Dd F;//三维矢量力(x,y,z三个方向的力) 2、对力的控制可以采用配置函数Set()与Get()函数; 3、对力觉的控制或读取操作需要放到【回调帧】开始与结束之间,如例子

xuliang355的博客 2561

Redis中的分布式锁如何实现可重入性和防止死锁的机制?

Redis提供了分布式锁的实现方案,但是在实际应用中,需要考虑到分布式锁的可重入性和防止死锁的机制。Redis作为一个高性能的内存数据库,被广泛应用于分布式系统中。在分布式系统中,往往需要使用锁来控制并发访问,保证数据的一致性和正确性。Redis提供了分布式锁的实现方案,但是在实际应用中,需要考虑到分布式锁的可重入性和防止死锁的机制。

leyang0910的博客 1271

等时替代模型( Isotemporal Substitution Model)

文献阅读:Associations of sedentary time and physical activity with adverse health conditions: Outcome-wide analyses using isotemporal substitution model(该论文于2022年4月28日发表在柳叶刀子刊 EClinicalMedicine 上)

姚巨龙的博客 1万+

嵌入式Linux开发必备:设备树插件动态加载实战指南(RK356x平台为例)

本文以RK356x平台为例,详细介绍了嵌入式Linux开发中设备树插件的动态加载实战。通过configfs接口,开发者可以在系统运行时动态修改硬件配置,实现外设的即插即用与调试,无需重启设备,极大提升了开发与调试效率。

w7x8y9z的博客 441

使用 Redis 实现分布式锁,解决分布式锁原子性、死锁、误删、可重入、自动续期等问题(使用SpringBoot环境实现)

使用 Redis 实现分布式锁,解决分布式锁原子性、死锁、误删、可重入、自动续期等问题(使用SpringBoot环境实现)

kerwin的博客 1万+

【深度学习】什么是交叉注意力机制?

输入序列:自注意力机制在同一个输入序列内建立注意力,交叉注意力机制在不同的输入序列间建立注意力。应用场景:自注意力机制多用于单一模态的任务(如纯文本任务),交叉注意力机制多用于多模态任务(如图像和文本的结合)。计算过程:自注意力机制的查询、键和值都来自同一个输入序列,而交叉注意力机制的查询来自一个输入序列,键和值来自另一个输入序列。

q742971636的博客 7365

Redis中的分布式锁(步步为营)

分布式锁指的是,所有服务中的所有线程都去获取同一把锁,但只有一个线程可以成功的获得锁,其他没有获得锁的线程必须全部等待,直到持有锁的线程释放锁。分布式锁是可以跨越多个实例,多个进程的锁互斥性:任意时刻,只能有一个客户端持有锁锁超时释放:持有锁超时,可以释放,防止死锁可重入性:一个线程获取了锁之后,可以再次对其请求加锁高可用、高性能:加锁和解锁开销要尽可能低,同时保证高可用安全性:锁只能被持有该锁的服务(或应用)释放。容错性:在持有锁的服务崩溃时,锁仍能得到释放,避免死锁。

m0_69632475的博客 1863

大数据分析利器:Tableau实战教程从入门到精通

你有3家分店,每月收集1000条销售数据(日期、分店、口味、销售额、订单数);想用Excel分析“哪家分店最赚钱”,但要做透视表→改格式→画柱状图,耗时30分钟,还经常因为公式错误返工;想看看“草莓味奶茶的月度销量趋势”,得手动筛选数据、调整折线图轴范围,稍不注意就漏看关键节点;想把分析结果分享给合伙人,Excel表格太抽象,对方盯着数字问“你到底想告诉我什么?

AI架构师小马 1488

避坑指南:新手爬百度图片3个致命错,改完批量保存本地(亲测有效)

新手爬百度图片的核心是“绕开静态HTML,抓准API接口+处理反爬+提取原图”,改完本文提到的3个核心错,就能稳定批量保存高清图片。这套思路可复用在其他图片网站(如必应图片、360图片),只需修改API接口和参数即可。如果想进一步优化,可添加代理IP池、多线程下载(新手不建议,容易触发反爬)、图片去重等功能!

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1585

Redis 分布式锁解决方案

分布式系统设计是实现复杂性和收益的平衡,既要尽可能地安全可靠,也要避免过度设计。Redlock 确实能够提供更安全的分布式锁,但也是有代价的,需要更多的 Redis 节点。在实际业务中,一般使用基于单点的 Redis 实现分布式锁就可以满足绝大部分的需求,偶尔出现数据不一致的情况,可通过人工介入回补数据进行解决,正所谓“技术不够,人工来凑”!。

java领域分享 1439

同步调相机启动与并网控制技术方案

同步调相机起动与并网控制技术方案采用背靠背变流器系统,通过静止变频器(SFC)策略实现无原动机驱动的同步电机从静止到同步转速的平稳起动。方案详细阐述了硬件自检、模块初始化、转子位置检测等关键环节,重点解决启动转矩为零、冲击电流大等挑战。系统基于STM32或C2000系列控制器,包含网侧/机侧变流器、检测保护单元及通信接口,通过励磁脉冲和电压响应分析实现高精度转子初始定位,为后续并网提供必要条件。代码级实现涵盖了ADC自检、数字IO验证及通信端口测试等核心功能。

huanghm88的专栏 305

分布式锁: 并发时,redis如何避免删别人的锁

通过唯一标识+原子化操作,Redis分布式锁可有效避免误删问题。正确实现后,能在多数场景下保障并发安全。

qq_40453972的博客 1297

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

计算机控制技术及应用

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

【Redis学习笔记】3:Redis主从架构的分布式锁失效问题 & 高并发量下性能优化

1 Redis主从架构的分布式锁失效问题 1.1 问题描述 在Redis主从架构中,写入都是写入主Redis实例,主实例会向从实例同步key。 一个业务线程A通过向主Redis实例中写入来实现加分布式锁,加锁后开始执行业务代码。这时如果主Redis实例挂掉了,会选举出一个从Redis实例成为主的,如果刚刚加锁的key还没有来得及同步到从Redis中,那么选举出来的新的主Redis实例中就没有这个key,这个时候业务线程B就能加锁来获取分布式锁,执行业务代码了,而这个时候A还没有执行结束,所以就会出现并发安全

大桔骑士的学习笔记 5709

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

redis分布式锁

每个线程释放锁的时候,去判断一下当前这把锁是否属于自己,如不属于自己,则不进行锁的删除,假设还是上边的情况,线程1卡顿,锁自动释放,线程2进入到锁的内部执行逻辑,此时线程1反应过来,然后删除锁,但是线程1,一看当前这把锁不是属于自己,于是不进行删除锁逻辑,当线程2走到删除锁逻辑时,如果没有卡过自动释放锁的时间点,则判断当前这把锁是属于自己的,于是删除这把锁。如若不是,则不释放锁。:大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程进行,让程序串行执行,这就是分布式锁的核心思路。

qq_52351978的博客 1016

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java面试中解决分布式锁失效的极限手段

在Java面试中,被追问分布式锁的底层实现和潜在问题时,如何在白板上用CAS底层推导解决ABA问题?应届生如何通过现场手撕AQS实现,向P7考官展示对并发机制的深刻理解?

u012252330的博客 825

分布式锁之Redis实现

分布式锁是一种跨进程的跨机器节点的互斥锁,可以保证多个进程对同一个共享资源的排他性. 本质上,分布式锁和一般线程锁都要满足一些锁的基本特性, 比如排他性,同一时刻只能有一个节点访问共享资源, 其次就是可重入性, 即允许一个已经获得锁的线程, 在没有释放锁之前, 重新去获得锁, 还有上锁和释放锁, 锁的失效机制(也就是死锁问题)等等

gtxy_2015的博客 1015

【Reids】分布式锁 --由浅入深实现Redis分布式锁

通过加锁可以解决在单机情况下的一人一单安全问题,但是在集群模式下就不行了。

gzkyyds的博客 1049

解决Redis分布式锁主从架构锁失效问题的终极方案 含面试题

在现代分布式系统中,分布式锁是实现并发控制的重要手段之一。而Redis作为一种高性能的缓存和消息中间件,其分布式锁机制备受关注和应用。然而,在Redis主从架构中,由于主从节点之间存在复制延迟,常常会出现锁失效的问题,给系统带来不稳定性和错误。本文将介绍Redis分布式锁主从架构锁失效问题的内在原理,分析导致锁失效的几个典型场景,并提出一种创新的解决方案,通过代码demo演示具体实现过程。希望本文能给读者带来启发,解决实际开发中遇到的锁失效问题。一、Redis分布式锁主从架构锁失效问题的内在原理。

赵KK的博客 2095

分布式锁-使用Redis实现分布式锁

使用Redis实现分布式锁 关于分布式锁的实现,我的前一篇文章讲解了如何使用Zookeeper实现分布式锁。关于分布式锁的背景此处不再做赘述,我们直接讨论下如何使用Redis实现分布式锁。 关于Redis,笔主不打算做长篇大论的介绍,只介绍下Redis优秀的特性。 支持丰富的数据类型,如String、List、Map、Set、ZSet等。 支持数据持久化,RDB和AOF两种方式 支持集群工作模式...

zhaoheng的博客 1171

redis setnx 分布式锁_手写Redis分布式锁

分布式锁使用场景现在的系统都是集群部署,每个服务都不是单节点的了。比如库存服务,可能部署到3台机器上分别命名为节点1,节点2,节点3。库存服务需要扣减库存,扣减库存肯定需要锁吧,如果使用Lock或者synchronized,只能锁住自己的节点。而从前台访问是随机路由到这3台节点的。如果线程一进来使节点1上了锁,当线程二进来可能访问到的是节点2,这时节点2还没有上锁,那么库存就会扣减错误。而库存扣减...

weixin_39861669的博客 177

Redis分布式锁实现以及避免死锁

分布式锁:当多个进程不在同一个系统中,用分布式锁控制多个进程对资源的访问 分布式锁应该具备哪些条件 在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行 高可用的获取锁与释放锁 高性能的获取锁与释放锁 具备可重入特性(可理解为重新进入,由多于一个任务并发使用,而不必担心数据错误) 具备锁失效机制,防止死锁 具备非阻塞锁特性,即没有获取到锁将直接返回获取锁失败 import com.demo.common.RedissonManager; import org.re..

MineCodelife的博客 1439

为什么同一接口流程有时需要加多层分布式锁来实现临界资源管理?为什么一层分布式锁无法过滤所有请求?

Redis 集群分片故障主要由于节点宕机、网络分区、数据同步延迟或锁实现问题导致。在分布式系统中,为了避免分布式锁失效,需要综合考虑 Redis 的高可用设计、锁实现的可靠性以及业务逻辑的防护措施。每次远程调用前重新加分布式锁,即一个流程中的不同阶段需要多次加锁,是为了在复杂的分布式环境下,保护数据一致性和操作的原子性。虽然在理论上第一次加锁可以保护后续操作,但由于分布式系统中可能发生锁失效、资源状态竞争、服务调用延迟等问题,每个阶段加锁是确保安全和正确性的必要措施。

Charles_Clark的博客 704

聊聊分布式锁

动手点关注干货不迷路????为什么我们需要一把分布式锁?为了效率(efficiency),协调各个客户端避免做重复的工作。即使锁偶尔失效了,只是可能把某些操作多做一遍而已,不会产生其它的不良后果。比如重复发送了一封同样的 email(当然这取决于业务应用的容忍度)。为了正确性(correctness)。在任何情况下都不允许锁失效的情况发生,因为一旦发生,就可能意味着数据不一致...

字节跳动技术团队官方博客 4614

【Redis】分布式锁

Redis分布式锁是一种在分布式系统中保证数据一致性和防止并发冲突的机制。它允许在不同的进程或服务器之间同步访问共享资源。

2202_75555590的博客 1325
上一篇: HTTPie: 开发者友好的http客户端工具
下一篇: 云原生可观测-日志观测(Loki)最佳实践
fire-flyer
博客等级 码龄14年 218粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

fire-flyer

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值