深入Redis:分布式锁

news2025/1/13 2:26:03

在一个分布式的系统中,会涉及到多个节点访问同一个公共资源的情况。此时就需要通过锁来做互斥控制,避免出现类似于“线程安全”的问题。

Java中的synchronize只能在当前线程中生效,在分布式的这种多个进程多个主机的场景下就无能为力了。此时就需要用到分布式锁。

分布式锁,本质上就是使用一个公共的服务器来记录加锁状态,这个公共的服务器可以是Redis,也可以是其他的组件(MySql或者Zookeeper等),也可以是自己写的一个服务。

基础实现

所有蓝色的模块,都是原先的服务器/客户端。现在加入一个橙色的Redis服务器作为分布式锁的管理器。

此时如果某客户端需要访问数据库,就需要先访问Redis,在Redis上设置一个键值对。设置value为1,而不是0。作此操作就可以对当前key加锁,操作完成后再把这个key删除。别的客户端需要访问这个key,发现Redis上已经有了这个键值对,就会阻塞等待或者放弃。

Redis中提供了setnx操作,正好适合这个场景:key不存在就设置,存在则直接失败。

过期时间

当服务器1加锁之后,意外宕机了,就会导致解锁操作一直不能执行,就可能引起其他服务器始终无法获取到锁的情况。为了解决这个问题,可以在设置key的同时引入过期时间,即这个锁最多持有多久就应该被释放。

Redis中提供了 set ex nx操作,可以在设置锁的时候同时把过期时间给设置进去。

校验ID

对于Redis中写入的加锁键值对,其他的节点也是可以删除的。(虽然不会主动删除,但是不排除遇到bug)。

为了解决上述问题,我们再引入一个校验ID,可以把设置的键值对的值,不在简单的设置成为一个1,可以设置成服务器的编号,如服务器1就设置成001。这样就可以在删除key的时候,先校验当前删除key的服务器是否是当初加锁的服务器,如果是才能真正删除。

看门狗(watch dog)

上述方案仍然存在一个重要的问题:如果如果任务还没执行完,key就过期了怎么办?

所谓的watch dog,本质上是加锁的服务器(发起加锁的服务器)上一个单独的线程。通过这个线程来对锁过期时间进行续约。

初始情况下设置过期时间为 10s,同时设定看门狗线程每隔 3s 检测一次
那么当 3s 时间到的时候,看门狗就会判定当前任务是否完成:

  • 如果任务已经完成,则直接通过 lua 脚本的方式,释放锁(删除 key)
  • 如果任务未完成,则把过期时间重写设置为 10s

这样就不担心锁提前失效的问题了,而且另一方面,如果服务器挂了,看门狗线程也就随之挂了,此时无人续约,这个key自然就可以迅速过期,让其他服务器能够获取到锁。

Redlock算法

实践中的Redis一般是以集群的方式部署的,就可能出现某些极端情况:

服务器1向master节点进行加锁操作,这个写入key的过程刚刚完成,master挂了。

slave节点升级成了新的master节点,但是由于刚刚写入的这个key还没有同步给slave,此时相当于服务器1的加锁操作形同虚设,服务器2仍然可以进行加锁。

我们引入一组 Redis 节点.其中每一组 Redis 节点都包含一个主节点和若干从节点,并且组和组之间存
储的数据都是一致的,相互之间是"备份"关系(而并非是数据集合的一部分,这点有别于 Redis cluster).
加锁的时候,按照一定的顺序,写多个master节点,在写锁的时候需要设定操作的"超时时间".比如
50ms.即如果 setnx 操作超过了 50ms 还没有成功,就视为加锁失败。

如果给某个节点加锁失败,就立即再尝试下一个节点。当加锁成功的节点数超过总节点数的一半,才视为加锁成功。
同理,释放锁的时候,也需要把所有节点都进行解锁操作。(即使是之前超时的节点,也要尝试解锁,尽量保证逻辑严密)。简而言之,Redlock算法的核心就是,加锁操作不能只写给一个Redis节点,而要写个多个。分布式系统中任何一个节点都是不可靠的。最终的加锁成功结论是"少数服从多数的"。由于个布式系统不至于大部分节点都同时出现故障,因此这样的可靠性要比单个节点来说靠谱不少。

至此,Redis告一段落~18篇文章不是Redis的完结,是新的篇章的开始~

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

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

相关文章

原型模式详细介绍和代码实现

🎯 设计模式专栏,持续更新中, 欢迎订阅:JAVA实现设计模式 🛠️ 希望小伙伴们一键三连,有问题私信都会回复,或者在评论区直接发言 Java实现原型模式 介绍: 原型模式(Prototype Patte…

C4D2025来了!亮眼的新功能一览

C4D2025新功能亮点,同步上新的Redshift 2025.0.2。等我体验了再给大家讲详细的 成都渲染101云渲染支持对应软件渲染,3090等显卡,云渲码6666 渲染101云渲码6666 Mograph增强 引入线性域标签,用于精细控制对象参数。 为追踪器对象新…

安泰功率放大器有哪些特点呢

功率放大器是电子设备中的重要组成部分,其作用是将输入信号的电功率放大到足够的水平,以驱动负载,如扬声器或天线。功率放大器有一些独特的特点,这些特点对于各种应用至关重要。下面将详细介绍功率放大器的特点,以更好…

【Vue】移动端访问Vue项目页面无数据,但是PC访问有数据

问题: Vue项目,PC访问时下拉列表有数据,移动端访问时下拉列表没有数据; 思路: 首先打开了Fiddler抓包工具,把抓到的url复制到PC浏览器进行访问,结果发现PC上访问这个页面是有数据的&#xff…

利用Leaflet.js创建交互式地图:绘制固定尺寸的长方形

在现代Web开发中,交互式地图已成为展示地理位置数据的重要工具。Leaflet.js是一个轻量级、功能丰富的开源JavaScript库,用于构建移动友好的交互式地图。在本文中,我们将探讨如何利用Leaflet.js在地图上绘制一个固定尺寸的长方形,扩…

堆+堆排序+topK问题

目录 堆: 1、堆的概念 2、堆的结构 3、堆的实现 3.1、建堆 3.1.1、向上调整建堆(用于堆的插入) 3.1.2、向下调整建堆 3.2、堆的删除 3.3、堆的代码实现 3.3.1、Heap.h 3.3.2、Heap.c 堆排序:(O(N*log(N))) 1、排序如何…

接口测试用例的编写

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 1、接口测试发现的典型问题 接口测试经常遇到的bug和问题,如下: 传入参数处理不当,导致程序crash类型溢出,导…

下载chromedriver驱动

首先进入关于ChromeDriver最新下载地址:Chrome for Testing availability 进入之后找到与自己所匹配的,在浏览器中查看版本号,下载版本号需要一致。 下载即可,解压,找到 直接放在pycharm下即可 因为在环境变量中早已配…

严重干扰的验证码识别系统源码分享

严重干扰的验证码识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comp…

领夹麦克风哪个品牌好?大疆、西圣、博雅无线麦克风在线测评

​随着科技的不断进步,越来越多的专业音频设备出现在大家的视野中,无线领夹麦克风就是其中之一,并且很多人在视频创作、直播等场景中都会进行选购。但是近些年来无线领夹麦克风市场较为复杂,很多质量不佳的产品混杂其中&#xff0…

安全生产许可证的重要性

在现代社会,安全生产许可证对于企业来说,不仅仅是一种法律要求,更是一种社会责任和企业形象的体现。本文将深入探讨安全生产许可证的重要性,以及它如何影响企业的长期发展和社会责任。 一、法律合规性的重要性 安全生产许可证是企…

Windows上指定盘符-安装WSL虚拟机(机械硬盘)

参考来自于教程1:史上最全的WSL安装教程 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/386590591#%E4%B8%80%E3%80%81%E5%AE%89%E8%A3%85WSL2.0 教程2:Windows 10: 将 WSL Linux 实例安装到 D 盘,做成移动硬盘绿色版也不在话下 - 知乎 (z…

那些网站需要使用OV SSL证书?怎么申请?

🔒 需要OV SSL证书的网站 🏢 企业网站 公司官网:展示公司信息、产品服务,增强信任度。 电子商务网站:处理在线交易,保护用户数据安全。 🏦 金融网站 银行网站:处理金融交易&#x…

SMB流量分析

SMB协议流量主要分为以下几个阶段 1、 tcp三次握手 2、会话建立(Negotiate Protocol): 客户端发送Negotiate Protocol Request ,其中包含客户端支持的smb协议版本列表以及SMB Header信息 服务端发送Negotiate Protocol Response,包含服务…

Springboot中自定义监听器

一、监听器模式图 二、监听器三要素 广播器:用来发布事件 事件:需要被传播的消息 监听器:一个对象对一个事件的发生做出反应,这个对象就是事件监听器 三、监听器的实现方式 1、实现自定义事件 自定义事件需要继承ApplicationEv…

Git学习尚硅谷(005 idea集成git)

尚硅谷Git入门到精通全套教程(涵盖GitHub\Gitee码云\GitLab) 总时长 4:52:00 共45P 此文章包含第27p-第p32的内容 文章目录 忽略特定文件在家目录里创建这个文件在.gitconfig文件里配置这个文件 配置IDEA定位到git程序进行添加文件初始化本地库添加单个…

yolov1到yolov5的发展

基础概念 1. YOLO简介 YOLO(You Only Look Once):是一种基于深度神经网络的对象识别和定位算法,其最大的特点是运行速度很快,可以用于实时系统。 2. 目标检测算法 RCNN:该系列算法实现主要为两个步骤&am…

数据结构排序——归并排序递归与非递归

基本思想: 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个…

CANopen协议的理解

本文的重点是对CANopen协议的理解,不是编程实现 参考链接 canopen快速入门 1cia301协议介绍_哔哩哔哩_bilibili CANopen是什么? CANopen通讯基础(上)_哔哩哔哩_bilibili CANopen概述 图1. CAN报文标准帧的格式 CAN的报文可简单…

50projects50days案例代码分析学习、效果,Html+CSS+JavaScript小案例

案例来源于:https://github.com/bradtraversy/50projects50days,部分资源需要科学上网加载使用,往后不再赘述。 合集链接,欢迎订阅: https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzkwODY2OTA5NA&actiongetal…