Redis分布式锁详解:从单机到集群环境的完整解决方案
创作时间:
作者:
@小白创作中心
Redis分布式锁详解:从单机到集群环境的完整解决方案
引用
CSDN
1.
https://blog.csdn.net/weixin_42675423/article/details/137255417
在分布式系统中,分布式锁是一种重要的同步机制,用于控制多个节点对共享资源的访问。本文将详细介绍如何使用Redis实现分布式锁,并针对单机Redis和集群Redis环境中的各种问题提供解决方案。
场景1:单机环境下的同步锁
在单机系统中,可以使用JVM级别的同步锁来实现加锁。所有线程都需要等待锁的释放。
场景2:分布式环境下的分布式锁
在分布式系统中,JVM级别的同步锁不再适用,因为只能锁住一个分布式节点。解决方案是使用Redis的setNX命令实现分布式锁。
setNX key value
key:锁的名称value:锁对应的值- 如果Redis中没有该锁,返回1,加锁成功
- 如果Redis中已有该锁,返回0,加锁失败
- 解锁:
del key
场景3:节点加锁后宕机
如果节点在处理业务过程中宕机,会导致分布式锁无法释放。解决方案是在分布式锁中添加过期时间。
SET key value EX 10 NX
- 设置key的过期时间为10秒
- 解锁:
del key
场景4:分布式锁过期释放问题
过期时间设置不当或GC时间过长可能导致锁提前释放。解决方案包括:
- 启动异步线程定时续期(watchdog机制)
- 使用唯一UUID+线程ID作为value,确保只释放自己的锁
SET ${lockName} 唯一的ID值 EX 10 NX
解锁时需要使用Lua脚本保证原子性:
current_value = get ${lockName}
if ${唯一的ID值} == current_value then
DEL ${lockName}
end
场景5:Redis集群环境中的主备切换问题
在主备切换时,可能会导致锁丢失。解决方案是向所有节点发送加锁请求,只有当半数以上节点加锁成功才认为加锁成功。
场景6:网络延迟造成的锁过期问题
在网络延迟较大的情况下,可能会导致锁提前过期。解决方案是在加锁时记录时间戳,并设置请求超时时间。
1. 记录加锁时的当前时间戳t1
2. 向所有节点发出加锁请求,为每一个请求设置超时时间(小于锁过期时间ttl),并记录最后收到返回的时间戳t2
3. 获取锁成功数量达到半数以上,并且t2-t1 < ttl才认为加锁成功
总结
单机Redis
- 增加过期时间:解决应用宕机,锁无法释放的问题
- 增加线程ID,表示锁的归属:解决锁被其他线程释放的问题
- 增加watchdog,为锁自动续期:解决锁被自动清理的问题
集群Redis
- 向所有节点发送加锁请求,半数成功:解决主从切换后的数据不同步问题
- 增加请求超时时间,判断请求时间的消耗:解决网络延迟造成的锁过期问题
本文详细介绍了Redis分布式锁的各种应用场景和解决方案,对于分布式系统开发人员具有很高的参考价值。
热门推荐
抑郁症引发左侧胸疼怎么办?四大方案助力缓解
红烧肉:醇香软糯,酱香浓郁
年末出游必看:专业医生详解时差应对全攻略
八招识破“海王”套路,教你远离情感陷阱
裁员风波后,如何用一份检讨书重建职场信任?
双色球12亿派奖来袭!胆拖投注攻略助你轻松中奖
李明王丽爱情故事搬上银幕,引爆泪点
南京大屠杀与奥斯维辛集中营:二战暴行的两个样本
乙水命职场攻略:适合你的职业与2025年运势
甘油三酯是血管硬化的元凶,6种高危食物要少吃
2024年广州校园摄影大赛:学生视角下的校园之美
鸡肉姜汤:传统养生还是感冒克星?
八字不合会影响什么?怎么算夫妻八字合不合
优质蛋白质,让你吃得健康又强壮!
罗非鱼:从生态适应到养殖挑战
被误解两千多年的叶公:从水利工程到平叛英雄
老北京炸酱面:一碗面里的百年京味传奇
麦琳又双叒叕上热搜,《再见爱人4》靠她火遍全网?
北欧国家如何通过高福利体系支持移民融入社会
大雪节气如何吃?营养师教你科学进补
50岁夫妻怎么相处好呢
炸里脊酥脆秘籍大公开,这样做外酥里嫩,堪比餐厅级美味!
科技创新引领杞县大蒜产业转型升级,年产值突破百亿
从选种到田管:青海高原春季大蒜种植全程指导
研究证实:啤酒白酒都会增加心血管风险,专家建议控制饮酒量
家庭主妇必学:滚筒洗衣机清洁秘籍
珠海圆明新园全攻略:四大园区、花车巡游,皇家园林里的现代游乐
短篇小说:婚姻
从于阗到拜占庭:丝绸制造技术的西传之路
泰国推SIM卡实名制:持有6张以上需验证,未实名将停用