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

Redis 分布式锁续期:锁还在,不代表业务安全

Redis 分布式锁续期:锁还在,不代表业务安全

一、分布式锁最怕误以为安全

Redis 分布式锁常用于防重复任务、定时调度、库存扣减和资源互斥。加锁成功后,很多代码就放心执行业务。但业务执行时间如果超过锁过期时间,或者续期线程异常,另一个实例可能拿到锁并发执行。

锁还在,不代表业务安全。锁的生命周期必须和业务状态一起设计。

二、锁要有唯一标识

flowchart TD A[请求加锁] --> B[写入锁值] B --> C[执行业务] C --> D[校验锁值] D --> E[释放锁]

释放锁时必须校验锁值,不能只按 key 删除。否则 A 的锁过期后 B 获得锁,A 结束时可能把 B 的锁删掉。

if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1]) else return 0 end

锁值通常使用 requestId 或随机 token。

三、续期要看业务边界

如果业务可能超过锁 TTL,可以做 watchdog 续期。但续期不是万能药。续期线程卡住、进程 STW、网络抖动,都可能导致锁失效。

lock_policy: ttl_seconds: 30 renew_interval_seconds: 10 max_hold_seconds: 300

要设置最大持有时间,避免业务卡死后锁一直续。

四、业务要能防重复

分布式锁只能降低并发概率,不能代替业务幂等。关键动作仍要有唯一约束、状态机或版本号兜底。

CREATE UNIQUE INDEX uk_job_day ON settlement_job(biz_date);

如果锁失效导致重复执行,数据库约束至少能挡住结果污染。

最后,锁要有监控。加锁失败率、锁持有时间、续期失败次数、超时释放次数,都能反映系统是否接近危险边界。

还要区分锁失败和业务失败。拿不到锁不一定是错误,可能只是另一个实例正在处理;续期失败则更危险,说明当前实例可能已经失去互斥保障。日志级别和告警策略要分开。

lock_metrics: acquire_failed: info_or_warn renew_failed: alert hold_time_p99: monitored force_release_count: alert

如果业务跨机房部署,还要谨慎使用单 Redis 锁。网络分区、主从切换、复制延迟都会影响锁语义。关键资金、库存或结算场景,不能只靠缓存锁兜底。

最后,锁粒度也要设计。锁太粗影响吞吐,锁太细容易漏互斥。按业务主键、租户、日期还是资源 ID 加锁,需要和并发冲突模型一致。

锁超时后的处理也要明确。业务执行到一半发现续期失败,不能假装什么都没发生继续写结果。可以设置中断标志,进入补偿流程,或者在最终提交前再次校验业务版本。

if (!lockService.stillOwner(lockKey, token)) { throw new LockLostException("lock ownership lost"); }

对于定时任务,锁失效后要避免两个实例同时推进游标。游标更新应使用乐观锁或唯一版本号,确保只有一个实例能提交进度。

还要给锁操作设置超时。Redis 调用本身如果卡住,业务线程不能无限等待。加锁、续期、释放都应该有短超时和失败处理。

最后,评审分布式锁代码时,要把“锁保护了什么资源”写清楚。看不清保护对象的锁,通常也很难证明它正确。

五、总结

Redis 分布式锁续期要校验锁值、设置 TTL 和最大持有时间,并用业务幂等兜底。

锁还在,不代表业务安全。真正安全的是锁、状态和约束一起工作。

http://www.jsqmd.com/news/1128885/

相关文章:

  • HashMap 源码
  • 项目编号:project51868|SpringBoot非遗保护与推广平台:项目档案、传承人、资讯传播与后台管理技术栈:SpringBoot + MySQL
  • FlexASIO终极指南:让普通音频设备拥有专业级ASIO性能
  • 傅里叶红外光谱(FT-IR)和原位红外(In Situ FTIR)应用案例
  • 21. 【C语言】打包不同类型:结构体
  • 英伟达市值突破 5.4 万亿美元,大模型厂商沦为算力佃农了吗?
  • 如何快速配置开源Android电视播放器:VLC电视版完整操作指南
  • AtCoder Weekday Consest 赛情分析及题解 | 汇总(更新至 AWC 0101 Beta)
  • 【关注可白嫖源码】--课程设计+毕业设计+springbootDream car车辆租赁系统[编号:project37878](案例分析)
  • 【关注可白嫖源码】--课程设计--毕业设计--30887基于微信小程序的社区志愿者服务平台设计与实现(案例分析)
  • 羞羞答答地搞了个数学宝典
  • 原子力显微镜(AFM)常见问题(二)
  • 【项目编号 project00919】Express社区生活服务系统:Node.js+MySQL打造社区服务预约与后台运营平台
  • [MAF Workflow编排模式-05]Group Chat:构建多人智囊团式的自由协作大群
  • 22. 【C语言】更深入的 struct:内存对齐与柔性数组
  • ArcGIS 10.x 空间参考实战:3步修复“数据源缺少空间参考”错误
  • 25. 【C语言】二进制文件与随机读写
  • Windows系统优化终极指南:三分钟让电脑焕然一新
  • 技术避坑(一):MetaPhlan 4和StrainPhlan 4联用分析菌株水平的传递
  • ZLMediaKit 9.0版本下载编译
  • groupby + agg:数据分析 80% 的活就这两招
  • 5个理由告诉你为什么VIA是机械键盘配置的终极选择
  • YOLO目标检测全栈实战:从v1到v13算法精讲与项目部署指南
  • AWS、微软、谷歌和 Anthropic 悄悄做了同一件事:Session 正在取代请求,成为 Agent 的新计算单元
  • HTTP(HyperText Transfer Protocol,超文本传输协议)是位于OSI七层模型和TCP/IP四层模型中**应用层**的协议
  • 终极Wand-Enhancer完全指南:5分钟解锁游戏修改器完整高级功能
  • 不同进程的线程切换**不一定引起进程切换**,但**必然涉及进程上下文切换(即进程切换)**——这里需要明确概念辨析
  • 55-LangChain核心概念-Chain-Agent-Tool-Memory关系
  • 从0到1用C#开发ABB机器人上位机:PC SDK通信+运动控制+状态监控
  • PyTorch 2.0+ 实战:Fashion MNIST 图像分类从 91% 到 95% 的 3 个调优技巧