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分布式锁的各种应用场景和解决方案,对于分布式系统开发人员具有很高的参考价值。
热门推荐
成都新津区创新治理共享单车乱象 数字技术+共治机制显成效
静脉溶栓的适应症和禁忌症是什么
全省首次!棕颈鸭现身台州玉环漩门湾湿地
被殴打时如何保护自己:实用指南与法律边界
找工作怎么变成了贷款买课?
【YOLO系列】YOLOv7论文解读
苏轼念奴娇·赤壁怀古原文译文注释赏析
跨省交通违章处理指南:三种便捷方式轻松应对异地违章
战锤40k为什么没有人工智能
油菜花的香味到底有没有(探究油菜花香味的来源和特点)
重庆磁器口古镇城市更新:“蝶变”后的“巴渝第一古镇”
姜堰大炉烧饼登上《舌尖上的中国4》,“焰火麒麟臂”烤出非遗美食
1000米跑步训练方法
今天,一起缅怀钱老
计划数和投档数是什么意思?招生计划和实际录取人数一致吗?
预计明年汛前“上岗” 我国首颗水利专业卫星有何独特之处?
李嘉诚遭遇十四年来最差成绩
雷军喜提1小时“中国首富体验卡”
保险公司代位追偿条款详解
如何分析一个城市的经济发展趋势?这些趋势对居民生活有何影响?
海口美兰区旅游攻略:人文风光与自然美景的融合之旅
印度小孩、昆仑山女头领怎么会在《西游记》里组成了天界亲友团?
如何跟踪游资动态
如何发掘团队个人优势
水草快速生根的秘诀:从光照到养护的全方位指南
植物油比较:如何选择最适合自己?六种植物油的功效与烹饪方式全解析
末伏的饮食莫松懈,不妨多吃这道菜,味道好营养足,当白饭吃也行
昆明量化交易机构在量化交易风险管理中如何运用大数据技术?
中国侦探小说百年重生:是通俗文学,更是现代进程
八数码难题的A*算法求解