基于Redis的高可用分布式锁——RedLock

目录

RedLock简介

RedLock工作流程

获取锁

释放锁


RedLock简介

  1. Redis作者提出来的高可用分布式锁
  2. 由多个完全独立的Redis节点组成,注意是完全独立,而不是主从关系或者集群关系,并且一般是要求分开机器部署的
  3. 利用分布式高可以系统中大多数存活即可用的原则来保证锁的高可用
  4. 针对每个单独的节点,获取锁和释放锁的操作,完全采用我们上面描述的单机版的方式

RedLock工作流程

获取锁

  1. 获取当前时间T1,作为后续的计时依据;
  2. 按顺序地,依次向5个独立的节点来尝试获取锁
  • (SET resource_name my_random_value NX PX 30000)
  1. 计算获取锁总共花了多少时间,判断获取锁成功与否
  • 时间:T2-T1

  • 多数节点的锁(N/2+1)

  1. 当获取锁成功后的有效时间,要从初始的时间减去第三步算出来的消耗时间

  2. 如果没能获取锁成功,尽快释放掉锁。

这里需要注意两点:

  1. 为什么要顺序地向节点发起命令,那么我们反过来想,假如不顺序地发起命令会产生什么问题?
    假如有3个客户端同时来抢锁,客户端A先获取到1号和2号节点,客户端B先获取到3号4号节点,客户端C先获取到5号节点,那么这时候就满足不了多数原则,5个节点的情况下,最少需要3个节点都获取到锁,才可以满足。

  2. 客户端在向每个节点尝试获取锁的时候,有一个超时时间限制,而且这个时间远小于锁的有效期,比如说几毫秒到几十毫秒之间,这样的机制是为了防止在向某一个节点获取锁的时候,等待的时间过长,从而导致获取锁的整体时间过长。比如说在获取锁的时候,有的节点会出现问题导致连接不上,那么这个时候就应该尽快地转移到下一个节点继续尝试,因为最终的结果我们只需要满足多数可用原则即可

释放锁

向所有节点发起释放锁的操作,不管这些节点有没有成功设置过.

正常情况下RedLock的运行状态

client1和client2,对Redis节点A-E进行抢锁操作,如图,client1先抢到节点ABC,超过半数,因此持有分布式锁,在持有锁期间,client2抢锁都是失败的,当时序=6时,client1才处理完业务流程释放分布式锁,这时候client2才有可能抢锁成功。

那么RedLock的主要流程就是这样,获取锁和释放锁,那么这个号称是真正的分布式锁,相比前面单机版的锁,很明显的一个点就是它不再是单点的,所以在高可用性上面,它是比单机版的锁有提升的。

但是,RedLock 是否就是一个很完美的解决方案呢?在一些特殊场景下会不会存在什么不足的地方?

此外,除了redis以外 ,其实我们可以用ZooKeeper来实现分布式锁

实际上Redis实现分布式锁的方式虽然性能比较高,但是在一些特殊场景下,它还是不够健壮,相比之下,ZooKeeper它的设计定位就是用来做分布式协调的工作,更加注重一致性,非常适合用来做分布式锁,总的来说使用ZooKeeper去实现分布式锁相比Redis的话会更加健壮一些。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vikayun维格云洞察:问答即洞察

在当今这个信息爆炸的时代,数据分析已经成为了企业和个人决策的重要依据。然而,面对海量的数据,如何从中提取有价值的信息,成为了一个亟待解决的问题。幸运的是,人工智能技术的发展为我们提供了一种全新的解决方案——利用AI进行数据洞察。今天,我们就来聊聊这个话题,看…

python-分享篇-使用MD5或SHA1等算法对用户密码进行加密

文章目录 代码效果 代码 对用户密码进行MD5或者SHA加密import hashlib str input(请输入要加密的字符串:) #MD5加密(返回32位16进制表示字符串) md5hashlib.md5() md5.update(str.encode(utf-8)) print(MD5加密:,md5.hexdigest())#SHA1加密&…

StoryGPT-V——可以生成漫画故事的多模态大模型

前言 目前,大型模型在复杂故事可视化任务方面依然面临着重大挑战。这是因为此类任务需要对框架描述中的代词(例如He、她、他们、他们)进行解析,即在分辨率和确保跨帧的角色和背景融合方面进行详细解剖。尽管存在这些挑战&#xf…

谷歌人工智能视频生成器-LUMIERE(未开源)

Google重磅发布视频生成模型Lumiere 据说后续会开源 亮点1.支持文本到视频与图像到视频 亮点2.画风迁移 亮点3.运动蒙版 亮点4.视频编辑 亮点5.视频修复 谷歌视频模型可以生成80帧的片段!不仅画质好、质量高,而且时长更长。 视频局部编辑 这项功能可以…

【旋转角度(CW/CCW)的累加计算】

1,需求 旋转角度(CW/CCW)的累加计算 2,代码实现 class AngleProcess:def __init__(self, is_cw, period360):self.is_cw is_cwself.period periodself.half_period period / 2self.init_angle_0_and_circle_num()def check_i…

麒麟系统—— openKylin 安装 redis

麒麟系统—— openKylin 安装 redis 一、准备工作1. 确保麒麟系统 openKylin 已经安装完毕。 二、下载安装文件三、解压安装解压安装 四、配置与运行修改配置文件以配置文件运行 五、加入到服务中最终:介绍配置的其他参数使用 Redis是一种开源的、基于内存的高速缓存…

python字典JSON 和csv文件

JSON与Python字典 Python中的字典与JSON非常类似而且支持嵌套结构。Json通过key取值的过程和python字典通过索引取值过程完全一致。JavaScript数据类型(值)对应的Python数据类型(值) JSONPythonobjectdictarraylist/tuplestring…

SQL基础知识整理--干货!常见的SQL面试题:经典50例!

SQL基础知识整理 select 查询结果,如: [学号,平均成绩:组函数avg(成绩)]from 从哪张表中查找数据,如:[涉及到成绩:成绩表score]where 查询条件,如:[b.课程号’0003′ and b.成绩>80]group by 分组,如:[…

【React】在项目中使用阿里图标库

文章目录 打开阿里图标库 》 选择相应图标项目 选择Symbol格式,并复制链接 基于antd新建一个JS文件 MyIcon.js,并绑定上面复制的链接 import { createFromIconfontCN } from ant-design/icons;// 图标有更新时,需更新下面图标链接 export…

关于虚拟机ubuntu系统无法上网问题

一、虚拟机的连接方式 1、查看自己虚拟机的网络连接方式 选择虚拟机->右键设置->网络适配器 2、拓展——虚拟机的三种网络模式 2.1 首先安装虚拟机后,可以看到主机网络适配器多2张网卡 2.2 在VMware虚拟机中查看网络设置 点击菜单栏编辑 -> 虚拟网络…

websocket 通信协议

websocket是什么 答: 它是一种网络通信协议,是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 意思就是服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息 属于服务器推送技术的一种. 为什么需要websocket? 疑问?…

Exchange:清理日志文件

准备脚本: 准备清理日志文件的脚本 # Set execution policy if not set $ExecutionPolicy Get-ExecutionPolicy if ($ExecutionPolicy -ne "RemoteSigned") {Set-ExecutionPolicy RemoteSigned -Force }# Cleanup logs older than the set of days in …