(Redis)Redis 分布式锁及改进策略详解

一、为什么需要分布式锁

在单机应用中,synchronizedReentrantLock 足以解决并发问题。但在 分布式系统 中,多台服务器之间共享同一个资源时,如果没有锁,很可能出现 超卖、重复扣减、数据不一致 等问题。
因此,分布式锁应运而生,Redis 因其高性能与丰富指令,成为分布式锁的常用实现工具。


二、Redis 实现分布式锁的基本原理

Redis 分布式锁主要基于 SET key value NX EX time 命令实现,核心思路:

  1. 加锁

    • 使用 SETNX 保证 key 不存在时才能成功设置。

    • 使用 EX 设置过期时间,避免死锁。

    • value 通常设置为随机值,用于标识锁的持有者。

  2. 解锁

    • 判断当前锁的 value 是否是自己设置的随机值。

    • 只有持有者才能释放锁。

    • 使用 Lua 脚本保证“查询 value + 删除 key”的原子性。

这样可以保证:

  • 互斥性:同一时刻只有一个客户端获取锁。

  • 避免死锁:即使客户端异常宕机,锁也会自动过期释放。

  • 可重入/安全解锁:通过 value 标识持有者,防止误删别人的锁。


三、可能存在的问题

  1. 锁过期导致并发

    • 如果业务逻辑执行时间 > 锁过期时间,可能导致锁自动释放,其他客户端拿到锁,出现数据不一致。

  2. 主从复制延迟问题

    • 在 Redis 主从架构下,如果主节点写入成功但未同步到从节点,主节点宕机后从节点被提升为主,会导致锁丢失。

  3. 不可重入性

    • 同一个线程多次加锁会失败,需要额外机制实现可重入。


四、改进策略

1. 合理设置过期时间

  • 根据业务逻辑耗时设置合理的锁过期时间。

  • 可结合 锁续期机制:在后台定时任务中为锁自动续期(如 Redisson 的 WatchDog)。

2. 使用 Lua 脚本保证原子性

  • 解锁必须使用 Lua 脚本,保证“判断 value + 删除 key”操作的原子性。

3. Redlock 算法(Redis 官方提出)

  • 通过 多个 Redis 实例 获取锁,必须在大多数节点上成功才算加锁成功。

  • 提高了分布式锁的可靠性,避免因单点故障导致锁失效。

4. 引入 Redisson 框架

  • Redisson 封装了分布式锁,支持可重入锁、公平锁、读写锁、自动续期等功能。

  • 在实际业务中更推荐使用,而不是自己手写。


五、典型应用场景

  1. 电商秒杀:防止超卖。

  2. 库存扣减:保证同一商品库存不会被多次扣减。

  3. 订单防重:防止重复提交订单。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/95113.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95113.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux应用开发-windows,linux环境下相关工具

VS Code Remote - SSH 虚拟机部分的操作 sudo systemctl status sshsudo apt update sudo apt install openssh-server sudo systemctl start ssh sudo systemctl enable ssh # 设置开机自启hostname -IVS Code部分的操作 安装 Remote - SSH 插件 vscode右下角出现&#xff…

Java泛型通配符详解:搞懂?/extends/super用法,避开集合操作踩坑点

上次跟你们聊了泛型的基础用法,今天接着往下说 —— 泛型里还有个挺重要的概念叫 “通配符”,就是那个问号 “?”,很多人第一次见都懵:这玩意儿跟普通泛型有啥区别?为啥有时候非得用它不可?小索奇当初也卡…

EXCEL开发之路(二)跨表交互模拟—仙盟创梦IDE

在车辆租赁行业,数据的高效管理与分析对于企业的运营决策、资源调配及客户服务优化至关重要。自建 Excel 实现多表统计交互,如同为行业装上了效能驱动引擎,助力企业在复杂多变的市场环境中稳健前行。一、精准资源管理,优化车辆调配…

医疗AI时代的生物医学Go编程:高性能计算与精准医疗的案例分析(八)

5.4 性能测试与结果分析 为了评估GoEHRStream的性能,我们设计测试模拟真实的医院数据流场景,并测量关键指标。 5.4.1 实验环境 硬件: CPU: Intel Xeon E-2288G (8 cores, 16 threads) RAM: 32 GB DDR4 Storage: 512 GB NVMe SSD (用于GoEHRStream和BadgerDB) Network: 1 G…

开关电源设计“反馈回路”部分器件分析

目录 主要分析问题如下: 一、问题1 二、问题二 分析电路如下: 主要分析问题如下: 1、分析TL431芯片1、2两引脚间并联电阻和电容(RC电路)的作用? 2、PC817A光耦输入两个引脚间并联电阻的作用?…

AI 编程新玩法:用 yunqi-saas-kit 框架制作小游戏,看广告变现轻松赚钱​

AI 编程新玩法:用 yunqi-saas-kit 框架制作小游戏,看广告变现轻松赚钱 在数字经济快速发展的当下,AI 技术正不断渗透到各个领域,其中 **#AI 编程凭借高效、便捷的优势,成为不少开发者和创业者的新选择。尤其是在小游戏…

Kafka 架构原理

一个kafka集群中包含一个或多个Producer、一个或多个broker、一个或多个ConsumerGrop以及一个Zookeeper集群。kafka通过Zookeeper管理kafka集群配置、leader副本的选举、生产者的负载均衡等。Producer使用push模式将消息发布到broker,Consumer使用pull模式从broker订阅并消费消…

用 PyTorch 搭建 CNN 实现 MNIST 手写数字识别

在图像识别领域,卷积神经网络(CNN) 凭借其对空间特征的高效提取能力,成为手写数字识别、人脸识别等任务的首选模型。而 MNIST(手写数字数据集)作为入门级数据集,几乎是每个深度学习学习者的 “第…

CTFshow系列——命令执行web61-68

本篇文章介绍了不同了方法进行题目的解析以及原因讲解。 文章目录Web61尝试了一下,被过滤的payload如下:所以,根据上述思路,这里尝试过的payload为:Web62(同Web61)Web63(同Web62&…

.Net程序员就业现状以及学习路线图(二)

一、.NET程序员就业现状分析 1. 市场需求与岗位分布 2025年.NET开发岗位全国招聘职位约1676个,占全国技术岗位的0.009%,主要集中在一线城市如深圳、上海等地。就业单位类型分布为:软件公司占43.3%,研发机构占33.1%,物联…

MTK Linux DRM分析(二十二)- MTK mtk_drm_crtc.c(Part1)

一、代码分析 mtk_drm_crtc.c以mtk_crtc_comp_is_busy函数为界限进行拆分分析 static const struct drm_crtc_funcs mtk_crtc_funcs = {.set_config = drm_atomic_helper_set_config,.page_flip = drm_atomic_helper_page_flip,.destroy = mtk_drm_crtc_destroy,.reset = mtk…

stm32f103c8t6 led闪灯实验

目录 闪灯原理 2种接线方式控制闪灯 使用推挽接法 使用开漏接法 看原理图 写代码 闪灯原理 LED灯有个2-10mA的电流就可以点亮 3.3/5100.006A6mA 2种接线方式控制闪灯 使用推挽接法 当设置推挽模式时,CPU控制寄存器写0,IO引脚输出低电压&#xff0…

“我同意”按钮别乱点——你的“职业EULA”漏洞扫描报告

尊敬的审核: 本人文章《“我同意”按钮别乱点——你的“职业EULA”漏洞扫描报告》 1. 纯属技术交流,无任何违法内容 2. 所有法律引用均来自公开条文 3. 请依据《网络安全法》第12条“不得无故删除合法内容”处理 附:本文结构已通过区块链存证…

Product Hunt 每日热榜 | 2025-09-01

1. A01 标语:你个人的新闻助手 介绍:A01 是你的新闻助手,可以帮你关注你关心的任何话题。只需告诉它你想了解什么,它就能为你带来最新的文章。 产品网站: 立即访问 Product Hunt: View on Product Hunt…

【OpenFeign】基础使用

【OpenFeign】基础使用1. Feign介绍1.1 使用示例1.2 Feign与RPC对比1.3 SpringCloud Alibaba快速整合OpenFeign1.3.1 详细代码1. Feign介绍 1.什么是 Feign Feign 是 Netflix 开发的一个 声明式的 HTTP 客户端,在 Spring Cloud 中被广泛使用。它的目标是&#xff…

访问相同的url,相同入参的请求,Apifox/Postman可以正常响应结果,而本地调用不行(或结果不同)

文章目录问题概述Apifox查看实际请求总结问题概述 开发中有一个需求需要去别的系统中拿数据,配置好相关参数后发起请求时发现响应结果和在Apifox上不同,Apifox上正常显示数据,而本地调用后返回数据不存在。 这就很奇怪了,想了很多…

数据结构(C语言篇):(七)双向链表

目录 前言 一、概念与结构 二、双向链表的实现 2.1 头文件的准备 2.2 函数的实现 2.2.1 LTPushBack( )函数(尾插) (1)LTBuyNode( ) (2)LTInit( ) (3)LTPrint( ) &#x…

从拿起简历(resume)重新找工作开始聊起

经济萧条或经济衰退在经济相关学术上似乎有着严格的定义,我不知道我们的经济是否已经走向了衰退或者萧条,但有一点那是肯定的,那就现在我们的经济肯定是不景气的。经济不景气会怎么样?是的,会有很多人失业,…

OS+MySQL+(其他)八股小记

鲁迅先生曾经说过,每天进步一点点,妈妈夸我小天才。 依旧今日八股,这是我在多个文档整合一起的,可能格式有些问题,请谅解。 操作系统 1.进程和线程的区别? 进程是代码在数据集合的一次执行活动,…

Transformer的并行计算与长序列处理瓶颈总结

🌟 第0层:极简版(30秒理解)一句话核心:Transformer像圆桌会议——所有人都能同时交流(并行优势),但人越多会议越混乱(长序列瓶颈)。核心问题 并行优势&#x…