redis面试(十八)RedLock加锁原理

news2024/10/1 5:37:51

什么是redLock

RedLock算法思想,不只在一个redis实例上创建锁,是在多个redis实例上创建锁,n / 2 + 1,必须在大多数redis节点上都成功创建锁,才能算这个整体的RedLock加锁成功,避免说仅仅在一个redis实例上加锁。
普通的redis分布式锁,其实是在redis集群中根据hash算法选择一台redis实例创建一个锁就可以了

大致流程如下:

  1. 获取当前时间戳,单位是毫秒
  2. 跟上面类似,轮流尝试在每个master节点上创建锁,过期时间较短,一般就几十毫秒,在每个节点上创建锁的过程中,需要加一个超时时间,一般来说比如几十毫秒如果没有获取到锁就超时了,标识为获取锁失败
  3. 尝试在大多数节点上建立一个锁,比如3个节点就要求是2个节点(n / 2 +1)
  4. 客户端计算建立好锁的时间,如果建立锁的时间小于超时时间,就算建立成功了
  5. 要是锁建立失败了,那么就依次删除已经创建的锁
  6. 只要别人创建了一把分布式锁,你就得不断轮询去尝试获取锁

实现

RLock lock1 = redisson.getLock("anyLock1");
RLock lock2 = redisson.getLock("anyLock2");
RLock lock3 = redisson.getLock("anyLock3");

RedissonRedLock redissonRedLock = new RedissonRedLock(lock1, lock2, lock3);
redissonRedLock.lock();
redissonRedLock.unlock();

剖析

RedissonRedLock锁的实现,非常的简单,他是RedissonMultiLock的一个子类,RedLock算法的实现,是依赖于MultiLock的一个机制来实现的
在这里插入图片描述

主要就是通过方法的重写,改变了MultiLock中的几个特殊的行为

failedLocksLimit,locks.size() - minLocksAmount(locks) = 1,也就是failedLocksLimit,就是能够加锁失败的一个数量

minLocksAmount(locks)里面就是用的大多数节点的一个算法,n / 2 + 1,比如你有3个lock,那么至少要成功加上3 / 2 + 1 = 2个lock

RedLock里包裹了3个小锁,最多能够加锁失败1个锁

calcLockWaitTime,这个东西算出来的时间,是说在对每个lock进行加锁的时候,有一个尝试获取锁超时的时间,原来默认的就是remainTime,4500毫秒,4500毫秒 / 3 = 1500毫秒,每个小lock获取锁超时的时间改成了1500毫秒

waitTime = 4500毫秒
remainTime = 4500毫秒
lockWaitTIme = 1500毫秒
failedLocksLimit,默认是0,就是一个锁都不能容忍加失败了,现在最新的是n - (n / 2 + 1),3个lock,最多可以容忍1个lock加锁失败
waitTime = 1500毫秒

对每个小lock尝试加锁的时候,能够容忍的最大超时时间,就是1500毫秒,1500毫秒之内必须加成功这个小锁,否则就是加锁失败

大家先试想一下,如果是之前讲解的那个最原始的MultiLock,如果任何一个lock加锁失败了,走这里会如何呢?failedLocksLimit = 0,不可能的,因为你都已经一个锁加锁失败了,所以此处不可能等于0

如果failedLocksLimit是0,默认的一个行为,此时就会将所有已经加锁的lock都释放掉,返回一个false,标记本次尝试加锁失败

之前讲解的那个MultiLock的话,只要你有任何一个锁加锁失败,此次加这个MultiLock就会标记为失败,再重来一次

但是,现在的话呢,使用的是RedLock,faildLocksLimit(3个小lock的时候,这个值是1),可以容忍一个锁加锁失败的,此时就会将failedLockLimit–,从1变为了0,也就是说之前可以容忍一次lock加锁失败,但是此时已经失败了一次了,不能再容忍加锁失败了

如果第二个lock加锁又失败了,此时failedLocksLimit已经是0了,那么就会标记为加锁失败,RedLock加锁失败了

如果是假设是3个lock,前2个加锁成功的,最后一个加锁失败了,3 - 2 = 1 = failedLocksLimit,此时是正好需要的最少的加锁的次数都加锁成功了,剩余的锁加锁失败了,也不要紧的,本次加锁就成功了

也就是说,针对多个lock进行加锁,每个lock都有一个1500毫秒的加锁超时时间,如果在4500毫秒内,成功的对n / 2 + 1个lock加锁成功了,就可以认为这个RedLock加锁成功了,不要求所有的lock都加锁成功的

RedLock,是一个锁,只不过是在各个不同的master实例上进行加锁,但是现在说RedLock合并了多个小lock。也就是说,如果你有3个redis master实例,你就用lock1、lock2、lock3三个锁key,人家本来就是分布在3个不同的redis master实例上的

加这个RedLock,相当于是3个redis master实例上的key,有2个加成功了,就算这个RedLock加锁成功了

此时别人如果要来加锁,用一样的key,人家是无法成功加锁的,锁被你占用了,人家就会卡在那儿,死循环,不断的尝试加锁,直到你释放锁
在这里插入图片描述

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

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

相关文章

uni-app01

工具:HuilderX noed版本:node-v17.3.1 npm版本:8.3.0 淘宝镜像:https://registry.npmmirror.com/ 未安装nodejs可以进入这里https://blog.csdn.net/a1241436267/article/details/141326585?spm1001.2014.3001.5501 目录 1.项目搭建​编辑 2.项目结构 3.使用浏览器运行…

【数据结构】总结二叉树的概念以及存储结构

目录 1. 树的概念及结构 1.1 树的名词定义 1.2 树的表示 2. 二叉树的概念及结构 2.1 二叉树的概念 2.2 特殊的二叉树 2.2.1 满二叉树 2.2.2 完全二叉树 2.3 二叉树的存储结构 2.3.1 顺序存储 2.3.2 链式存储 3. 选择题 1. 树的概念及结构 1.1 树的名词定义 1. 节…

基于x86 平台opencv的图像采集和seetaface6的口罩人脸检测识别功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.2 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的口罩人脸检测识别功能,opencv通过摄像头采集视频图像,将采集的视频图像送给seetaface6的口罩人脸检测…

Docusign 电子签名的合法性指南【中国】

电子签名法律概述 中华人民共和国(“中国”)于2004年颁布了《电子签名法》(“电子签名法”),并于2015年和2019年进行了重大修订。电子签名法规定,只要当事人同意采用电子签名形式,文件的法律效…

基于重要性加权的LLM自我改进:考虑分布偏移的新框架

LLM自我改进的典型范式是在自生成数据上训练LLM,但是其中的部分数据可能有害,所以应该被过滤掉。但是目前的工作主要采用基于答案正确性的过滤策略,在这篇论文中,证明过滤掉正确但具有高分布偏移程度(DSE)的样本也可以有利于自我改进的结果。 论文的主要贡献如下: 提出了一个…

高并发集群饿了么后端的登录模块

高并发集群饿了么后端的登录模块 1.数据库 非交互式python: 非交互式: 2.数据库的负载均衡:阿里巴巴的mycat 修改配置文件 /usr/local/mycat/conf/server.xml :对外的账号 密码 数据库 /usr/local/mycat/conf/schema.xml 如果出现启动异常&…

搭建自己的金融数据源和量化分析平台(七):定时更新上市公司所属行业门类及大类

0x00 前言 由于此前从深交所下载的股票信息中只有行业门类信息,没有行业大类信息,导致后续解析三大报表和量化选股的时候无法进行: 可以看到深交所的股票是没有大类信息的。 再看看上交所的保险股: 因此需要将深交所股票的所属…

关于 IoTDB 的疑问,我们这次有奖征集!

新的社区活动来啦! 你是否对 IoTDB 的技术/操作还有疑问,并需要得到原厂研发团队的解答? 你是否希望在踊跃提出疑问的同时,收获一份精美小礼物? 为回馈新老朋友对 Apache IoTDB 开源社区的活跃贡献,最新社区…

数据结构day01(数据结构、算法基础知识)

目录 【1】数据结构基础知识 1》什么是数据结构 2》数据 3》逻辑结构 1>线性关系 2>层次关系 3>网状关系 4》存储结构 1>顺序存储 2>链式存储 3>索引存储结构 4>散列存储 5》操作 【2】算法基础知识 1> 什么是算法 2> 算法设计 3> 算…

8金收官!仿真工程师为你揭秘中国跳水梦之队的“水花消失术”

巴黎奥运会上,中国跳水梦之队再一次上演“水花消失术”,不仅赢得了裁判的高分,也令全球观众惊叹不已。 发挥出色的运动员入水如同“牛奶入水”,顺滑得仿佛不带一丝涟漪;而发挥失误的运动员仿佛“炸鱼队”来袭&#xf…

.Net Linux平台下System.Drawing.Imaging替代方案

文章目录 前言一、ImageSharp库二、SkiaSharp库三、System.Drawing.Common库总结 前言 在.NET Standard中,System.Drawing.Imaging 命名空间并不直接支持,因为 System.Drawing 命名空间主要是为了Windows Forms(WinForms)和GDI设计…

FPGA第 5 篇,FPGA技术优略势,FPGA学习方向,FPGA学习路线,FPGA专业知识的学习方向(FPGA现场可编程门阵列学习路线和方向)

前言 前几篇讲了一下FPGA的发展和应用,以及未来前景。具体详细,请看 FPGA发展和应用,以及未来前景https://blog.csdn.net/weixin_65793170/category_12665249.html 这里我们来,记录一下,FPGA专业知识的学习路线 一.…

World of Warcraft [CLASSIC] the Eye of Eternity [EOE] P1-P2

World of Warcraft [CLASSIC] the Eye of Eternity [EOE] 永恒之眼(蓝龙) 第一阶段 第二阶段 第三阶段 载具1-6技能介绍 World of Warcraft [CLASSIC] the Eye of Eternity [EOE]_永恒之眼 eoe-CSDN博客 永恒之眼怎么出副本呢,战斗结束&am…

泛微E9如何更新缓存

泛微E9如何更新缓存 在E9中,是默认开启了数据缓存的,如果直接操作数据库是会存在缓存不更新的问题,E9系统提供以下几种方式进行缓存清空的方式。 注:原则上禁止通过非程序渠道直接修改OA数据库数据,可以直接在页面进行…

LCR 162. 数字 1 的个数 题解

189轮转数组 189. 轮转数组 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 时间复杂度o(n),空间复杂度 o(1) class Solution {public void rotate(int[] nums, i…

Python 如何使用 functools 模块

functools 模块是 Python 标准库中的一个重要模块,它提供了一些有用的高阶函数和工具,帮助开发者更轻松地操作和处理函数。functools 中的工具主要用于函数的缓存、包装、偏函数等功能。 1. functools 模块概述 functools 模块的设计目的是为了简化和增…

无人机+消防车:高楼灭火系统技术详解

“无人机消防车”高楼灭火系统技术是一种创新的消防解决方案,旨在解决高层建筑灭火难题。以下是对该技术的详细解析: 一、技术背景与需求 高层建筑数量多,火灾隐患多发。根据国家消防救援局发布的数据,高层建筑火灾频发&#xf…

MyBatis核心机制

实现MyBatis核心机制环境搭建 1.核心框架示意图 2.模块搭建 1.创建maven项目 2.引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSc…

超维机器人在工业与能源领域的具身智能探索和应用

具身智能&#xff08;Embodied AI&#xff09;是指机器人能够通过其物理形态与环境的交互&#xff0c;进行感知、学习、决策和执行&#xff0c;从而完成复杂任务的能力。具身智能强调机器人不仅要具备感知环境和分析数据的能力&#xff0c;还要能够通过身体的行为和物理互动来适…

zabbix5.0与7.0版本区别 切换建议

Zabbix5.0和Zabbix7.0的区别 1. 性能和扩展性优化 1.1 高效的数据处理和存储 优化的数据库性能&#xff1a; Zabbix 7.0 在数据库层面进行了多项优化&#xff0c;以减少查询延迟和提高数据处理速度。这包括对数据库结构的改进和索引优化&#xff0c;使得大规模数据的读取和写…