Redlock算法实现Redis分布式锁

Redlock算法实现Redis分布式锁

为什么基于故障转移的实现还不够

使用 Redis 锁定资源的最简单方法是在实例中创建密钥。密钥通常是在有限的生存时间内创建的,使用 Redis 过期功能,以便最终它被释放(我们列表中的属性 2)。当客户端需要释放资源时,它会删除密钥。

从表面上看,这很好用,但有一个问题:这是我们架构中的单点故障。如果 Redis 主节点出现故障会怎样? 好吧,让我们添加一个副本!如果主站不可用,请使用它。不幸的是,这是不可行的。这样一来,我们就无法实现互斥的安全属性,因为 Redis 复制是异步的

此模型存在竞争条件:

  1. 客户端 A 获取主服务器中的锁。
  2. 在对密钥的写入传输到副本之前,主服务器崩溃。
  3. 复制副本将升级为主副本。
  4. 客户端 B 获取 A 已为其持有锁的同一资源的锁。违反安全规定!

在这里插入图片描述

如何实现单个实例的Redis分布式锁

  SET resource_name my_random_value NX PX 30000

仅在秘钥不存在时生成秘钥,并且其中的值my_random_value是全局唯一的,并设置过期时间30000ms

使用随机值是为了以安全的方式释放锁,并带有一个脚本告诉 Redis:仅当密钥存在并且存储在密钥中的值正是我期望的值时才删除密钥。这是通过以下 Lua 脚本完成的:

if redis.call("get",KEYS[1]) == ARGV[1] then
    return redis.call("del",KEYS[1])
else
    return 0
end

使用lua脚本是为了保证语句的原子性;

防止误删key为了避免删除由其他客户端创建的锁,这一点很重要。例如,客户端可能会获取锁,在超过锁有效期(密钥过期的时间)的运行时间长于某些操作时被阻止,然后删除已由其他客户端获取的锁。 仅使用 DEL 是不安全的,因为客户端可能会删除另一个客户端的锁。使用上面的脚本,每个锁都使用随机字符串进行“签名”,因此只有当它仍然是客户端尝试删除它时设置的锁才会被删除。

这个随机字符串应该是什么?我们假设它是 的 20 个字节,但您可以找到更便宜的方法来使其对您的任务足够独特。 例如,一个安全的选择是用 为 RC4 提供种子,并从中生成伪随机流。 更简单的解决方案是使用具有微秒精度的 UNIX 时间戳,将时间戳与客户端 ID 连接起来。它不那么安全,但对于大多数环境来说可能已经足够了

Redlock算法

用来实现基于多个实例的分布式锁。

锁变量由多个实例维护,即使有实例发生了故障,锁变量仍然是存在的,客户端还是可以完成锁操作。

该方案也是基于(set 加锁、Lua 脚本解锁)进行改良的,所以redis之父antirez 只描述了差异的地方,大致方案如下。

假设我们有N个Redis主节点,例如 N = 5这些节点是完全独立的,我们不使用复制或任何其他隐式协调系统,确保它们以几乎独立的方式失败

为了取到锁客户端执行以下操作:

1获取当前时间,以毫秒为单位;
2依次尝试从5个实例,使用相同的 key 和随机值(例如 UUID)获取锁。当向Redis 请求获取锁时,客户端应该设置一个请求超时时间,这个超时时间应该小于锁的失效时间。例如你的锁自动失效时间为 10 秒,则超时时间应该在 5-50 毫秒之间。这样可以防止客户端在试图与一个宕机的 Redis 节点对话时长时间处于阻塞状态。如果一个实例不可用,客户端应该尽快尝试去另外一个 Redis 实例请求获取锁;
3客户端通过当前时间减去步骤 1 记录的时间来计算获取锁使用的时间。当且仅当从大多数(N/2+1,这里是 3 个节点)的 Redis 节点都取到锁,并且获取锁使用的时间小于锁失效时间时,锁才算获取成功;
4如果取到了锁,其真正有效时间等于初始有效时间减去获取锁所使用的时间(步骤 3 计算的结果)。
5如果由于某些原因未能获得锁(无法在至少 N/2 + 1 个 Redis 实例获取锁、或获取锁的时间超过了有效时间),客户端应该在所有的 Redis 实例上进行解锁(即便某些Redis实例根本就没有加锁成功,防止某些节点获取到锁但是客户端没有得到响应而导致接下来的一段时间不能被重新获取锁)。

该方案为了解决数据不一致的问题,直接舍弃了异步复制只使用 master 节点,同时由于舍弃了 slave,为了保证可用性,引入了 N 个节点,官方建议是 5。

客户端只有在满足下面的这两个条件时,才能认为是加锁成功。

条件1:客户端从超过半数(大于等于N/2+1)的Redis实例上成功获取到了锁;

条件2:客户端获取锁的总耗时没有超过锁的有效时间。

N = 2X + 1 (N是最终部署机器数,X是容错机器数)

Redlock的实现之Redisson

Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格(In-Memory Data Grid)

加锁:
在这里插入图片描述

在这里插入图片描述
通过redisson新建出来的锁默认是30s过期时间
在这里插入图片描述

可重入:
在这里插入图片描述
采用hset,如果所不存在则创建锁并设置过期时间,如果key存在则锁的值递增,如果锁已存在但并非本线程则返回过期时间
续期:

额外起一个线程,定期检查线程是否还持有锁,如果有则延长过期时间。

Redisson 里面就实现了这个方案,使用“看门狗”定期检查(每1/3的锁时间检查1次),如果线程还持有锁,则刷新过期时间;

在这里插入图片描述

在这里插入图片描述
这里面初始化了一个定时器,dely 的时间是 internalLockLeaseTime/3。
在 Redisson 中,internalLockLeaseTime 是 30s,也就是每隔 10s 续期一次,每次 30s。
客户端A加锁成功,就会启动一个watch dog看门狗,他是一个后台线程,会每隔10秒检查一下,如果客户端A还持有锁key,那么就会不断的延长锁key的生存时间,默认每次续命又从30秒新开始
自动续期的lua脚本
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

漫步者开放式耳机怎么样?南卡、漫步者开放式耳机哪个好?

现在开放式耳机的市场越来越混杂,我们作为消费者在挑选的时候,一定要找准需求点才能把踩坑几率降到最低。实在不会挑选的也不要紧,我最近入了2款目前市面最畅销的百元款开放式耳机:南卡OE CC和漫步者comfo fit,亲身上耳…

深入理解MVCC与BufferPool缓存机制

http://note.youdao.com/noteshare?idb36b975188fadf7bfbfd75c0d2d6b834&sub5A7459FE4B464EC896F9DD9A4 E MySQL在读已提交和可重复度隔离级别下都实现了MVCC机制 begin/start transaction 命令并不是一个事务的起点,在执行到它们之后的第一个修改操作InnoDB…

ubuntu windows 文件格式^M 问题

dos2unix是将Windows格式文件转换为Unix、Linux格式的实用命令。Windows格式文件的换行符为rn ,而Unix&Linux文件的换行符为n。 dos2unix命令其实就是将文件中的rn 转换为n。 而unix2dos则是和dos2unix互为孪生的一个命令,它是将Linux&Unix格式文件转换为Wi…

【Linux】telnet命令使用

telnet命令 telnet命令用于使用telnet协议与另一台主机进行通信。如果在没有主机参数的情况下调用telnet,它将进入命令模式,由其提示(telnet>)指示。在这种模式下,它接受并执行下面列出的命令。如果使用参数调用它…

二叉树的链式结构

1.二叉树的构建 想要对二叉树进行操作,我们得先构建一个二叉树 因此,这里的问题就是给定数据,如何将数据在逻辑结构上变成二叉树? 结构定义: typedef int BTDataType;typedef struct BinaryTreeNode {BTDataType v…

【go语言开发】go项目打包成Docker镜像,包括Dockerfile命令介绍、goctl工具生成

本文主要介绍如何将go项目打包成镜像,首先介绍Dockerfile常用命令介绍,然后介绍使用工具goctl用于生成Dockerfile,还可以根据需求自定义指令内容,最后讲解如何将go-blog项目打包成镜像,以及如何运行等 文章目录 前言Do…

助力乡村振兴:VR全景技术能在乡村发展哪些方面提供帮助

引言: VR全景技术是具有巨大潜力的创新技术,它能够为乡村振兴带来许多机会。通过创建沉浸式的虚拟现实环境,VR全景技术在乡村旅游、农业、教育和文化推广等方面都能发挥重要作用。 一、乡村旅游 1.提升乡村景区宣传效果 通过使用VR全景技术…

IDEA 2023版本解决Error running Command line is too long. Shorten the command line

报错信息 Error running XXXApplication. Command line is too long. Shorten the command line via JAR manifest or via a classpath file and rerun. 解决方法 1.右键服务 选择Edit Configuration 2. 点击 Modify options 3. 勾选Shorten commnand line 4. 修改并保存

Java 实现 图片 添加 文字水印、图片水印 工具类

一、话不多说,直接上代码 1.1,水印类型枚举 import lombok.AllArgsConstructor; import lombok.Getter;/*** author: wangjing* createTime: 2023-12-05 15:01* version: 1.0.0* Description: 水印类型枚举*/ Getter AllArgsConstructor SuppressWarni…

已解决error: (-215:Assertion failed) inv_scale_x > 0 in function ‘cv::resize‘

需求背景 欲使用opencv的resize函数将图像沿着纵轴放大一倍,即原来的图像大小为(384, 512), 现在需要将图像放大为(768, 512)。 源码 import cv2 import numpy as np# 生成初始图像 img np.zeros((384, 512), dtypenp.uint8) img[172:212, 32:-32] 255 H, W …

天池SQL训练营(二)-SQL基础查询与排序

-天池龙珠计划SQL训练营 Task02:SQL基础查询与排序 SQL训练营页面地址:https://tianchi.aliyun.com/specials/promotion/aicampsql 一、SELECT语句基础 1.1 从表中选取数据 SELECT语句 从表中选取数据时需要使用SELECT语句,也就是只从表…

机器学习---线性回归算法

1、什么是回归? 从大量的函数结果和自变量反推回函数表达式的过程就是回归。线性回归是利用数理统计中回归分析来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。 2、一元线性回归 3、多元线性回归 如果回归分析中包括两个或两个以上的自变量&a…

基于springboot校园二手平台的开发与设计

目 录 1 绪论 1 1.1 课题研究背景 1 1.2 研究意义 1 1.3 研究的目标 2 2 系统技术选型 3 2.1 数据库选择 3 2.2 开发工具的选择 3 2.3 后端框架选择 3 2.4 前端框架选择 3 3 系统需求和可行性分析 4 3.1 总体设计原则 4 3.2 需求分析 4 3.3 可行性分析 5 3.3.1 技术可行性 5 3…

我想修改vCenter IP地址

部署vCenter Server Appliance后,您可以在vCenter修改DNS设置并选择域名服务器使用。您可以编辑vCenter Server Appliance的IP地址设置。从vSphere 6.5开始正式支持vCenter修改IP地址。因此可以更改vCenter Server Appliance的IP地址和DNS设置。 注意:更…

shein、亚马逊卖家测评如何利用自养买家号提升购买转化率?

自养买家号测评的作用,对于众多卖家来说,恐怕并不陌生。它可以快速注入评论,提升排名,创建热卖商品的一种催化剂。在当前电子商务行业蓬勃发展的背景下,买家号的重要性越来越凸显。 买家会花时间浏览店铺的评价&#…

Unity随笔1 - 安卓打包JDK not found

今天遇到一个很奇怪的事情,之前可以正常打安卓包,但是突然报错如下: 提示很明显,找不到JDK了。可是我在下载Unity的时候明明安装了所有需要的组件,为什么今天突然不行。 看了眼Unity hub里面,没问题。 那就…

一文了解直流稳压电源调试方法

直流稳压电源是是一种将交流或直流电源转换为稳定直流电压的电子装置,被广泛应用于国防、科研、医疗、通讯、工业自动化设备等领域。 直流稳压电源一般由变压器、整流电路、滤波电路和稳压电路组成。变压器会将交流电源转换为所需的电源电压,整流电路将交…

Leetcode—383.赎金信【简单】

2023每日刷题(五十) Leetcode—383.赎金信 实现代码 class Solution { public:int arr[26] {0};int arr2[26] {0};bool canConstruct(string ransomNote, string magazine) {int len ransomNote.size();int len2 magazine.size();for(int i 0; i …

csv文件中账号数字显示为科学计数法1.23E+16

参见: 如何解决导出csv文件数字自动变为科学计数法(数值中带E)_csv格式数字老是变成什么e-CSDN博客 其中,在倒数第2张图 里 选“新工作表”。

什么是LIMS实验室信息管理系统 LIMS系统功能介绍

实验室信息管理系统,也称为 LIMS系统,是一种软件解决方案,它通过自动化手动流程来支持现代实验室操作。因此,生命科学专业人员可以实时访问准确无误的信息。该软件使用户能够更有效地管理样本、分析相关数据并根据相关数据采取行动…