分布式锁方案分析:看图说话(图+文)

news2024/11/24 19:24:54

1 缘起

曾经在看分布式锁的时候,还是处于了解阶段,
回头总结时,发现有很多细节没有探究到,
本文以-看图说话的方式分析不同的分布式锁方案,
分布式锁需要保证:
(1)互斥性:任意时刻,只有一个客户端可以持有锁;
(2)锁超时释放:保证资源循环利用,避免死锁(长生锁);
(3)可重入性:一个线程可重复申请锁;
(4)安全性:锁只能被持有锁的客户端释放(删除);
(5)高性能和高可用:加锁和释放锁低时延,高可用,避免单机锁失效。
因此,在设计分布式锁方案时,根据高性能要求,选择Redis作为存储介质,
同时,将设计方案细分为非原子方案和原子方案,
梳理成果分享如下,帮助读者系统地了解分布式锁方案,轻松应对知识分享与考核。

2 非原子性方案

非原子性即获取锁和添加过期时间分成两个步骤进行,
先使用setnx获取锁,然后setex为锁添加过期时间,
完整流程图如下图所示。
由图可知,当setnx成功执行后,服务突然出现异常,没有正常进入setex这个步骤,
这就导致:公共资源添加的锁没有配置过期时间,如果配置了持久化,这个资源锁会常驻,
当再次获取该资源时,由于该资源锁已经存在,所有线程均无法获取该资源锁,导致,资源不可用。

在这里插入图片描述

3 原子性方案

原子性方案即把资源锁和配置相关数据封装在一个原子操作中,
可以使用Redis的set扩展命令、setnx+过期时钟以及Lua脚本实现原子性。
不过,这里分成单机版Redis和多机版Redis两种方案。

3.1 单机Redis

单机版Redis是指只有一个Master生效,所有的请求都是在这一个Master中操作,
无论是使用哨兵模式还是集群模式,生效的都是一个Master。

3.1.1 setnx+过期时钟

上面的非原子性操作,会导致“长生锁”,需要将操作合成一个操作,
同样使用setnx可以将配置的值置为过期时钟,即:currentTimeMilliseconds+expire,
当前系统毫秒时间+过期时间(毫秒),
这样,就变相地实现了原子操作,
完整的流程如下图所示,
由图可知,此方案虽然可以保证一个服务的线程安全,但是,分布式服务而言,会出现,服务1将服务2的锁释放,
因为,在Redis存储的数据,没有做物理上的隔离,任何客户端都可以操作这个公共的数据,只是做了逻辑上(代码级别)的隔离。
在这里插入图片描述

3.1.2 set扩展命令

为实现添加数据和配置过期时间的原子性,
Redis提供了set的扩展指令,同时实现添加不存在的数据(nx)、配置过期属性(ex[秒]或px[毫秒])、过期值(expire),
完整的流程如下图所示,由图可知,
此方案,保证了操作的原子性,但是,存在多线程安全问题。
在这里插入图片描述
多线程安全示意图如下图所示,
由图可知,多线程情况下,线程1会释放线程2的锁,
打了一个时间差,原因还是同一个原因,数据没有物理隔离,只做了逻辑(代码级)的隔离。
在这里插入图片描述

3.1.3 set扩展命令+随机唯一值

为了保证线程安全,在set扩展命令基础上,添加唯一随机值,
保证多线程操作安全,完成流程图如下图所示,由图可知,
此方案,保证了多线程逻辑层面安全,服务间的安全仍未保证。
同时,存在,业务未执行结束,锁过期的问题。
在这里插入图片描述

3.1.4 Redisson

Redisson解决了业务未执行结束,锁过期的问题。
Reidsson方案添加了一个后台看门狗线程,监控当前锁是否被占有,
如果被占用,则延长锁过期时间,保障当前业务执行过程中,锁不会过期,
完整流程图如下图所示,
虽然此方案,解决了业务时间与过期时间的问题,仍存在单机故障问题,
当主节点故障时,数据还未同步到从节点,从节点升级为主节点后,锁就丢失了。
在这里插入图片描述

3.2 多机Redis

多机Redis是指多个Redis主节点,这些主节点是独立运行的集群或哨兵。

RedLock

多机Redis方案即RedLock,操作时,服务依次向各个主节点获取锁,
当成功获取锁的数量大于Redis主节点半数时,获取锁成功,
完整的流程如下图所示。
该方案,可以结合Redisson实现,各个主节点中采用Redisson方案,
总的框架是RedLock思想。
在这里插入图片描述

4 小结

分布式锁:任意时刻,有且仅有一个线程可操作公共资源。
分布式锁特征:
(1)互斥性:任意时刻,只有一个客户端可以持有锁;
(2)锁超时释放:保证资源循环利用,避免死锁(长生锁);
(3)可重入性:一个线程可重复申请锁;
(4)安全性:锁只能被持有锁的客户端释放(删除);
(5)高性能和高可用:加锁和释放锁低时延,高可用,避免单机锁失效。
分布式锁方案:单机:Redisson和多机:RedLock等。

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

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

相关文章

【从零开始学习深度学习】46. 目标检测中锚框的概念、计算方法、样本锚框标注方式及如何选取预测边界框

本文主要介绍目标检测中常用到的锚框相关概念、计算方式、样本标注及如何选取预测边界框并输出的相关内容。 目录1. 锚框介绍1.1 生成多个锚框2. 交并比--Jaccard系数3. 标注训练集的锚框4. 输出预测边界框---非极大值抑制方法总结1. 锚框介绍 在目标检测算法中通常会在输入图…

Linux常用命令——xhost命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) xhost 制哪些X客户端能够在X服务器上显示 补充说明 xhost命令是X服务器的访问控制工具,用来控制哪些X客户端能够在X服务器上显示。该命令必须从有显示连接的机器上运行。可以通过使用-host参数&…

​Topaz Photo AI 人工智能图像降噪锐化放大

Topaz Photo AI 是一款强大的基于人工智能技术的降噪、锐化及放大的工具。它不仅可以作为独立的软件使用,也可作为 Photoshop 的插件,以及能在 Lightroom Classic、Capture One 中调用。在 Lightroom Classic 中提供了两种工作流程,一种是直接…

while和do while的用法区别

前言在上一篇文章中,壹哥给大家讲解了循环的概念,并重点给大家讲解了for循环的使用。但在Java中,除了for循环之外,还有while、do-while、foreach等循环形式。今天小千就再用一篇文章,给大家讲解while循环的使用。本文带…

webshell 一句话木马

Webshell(大马):webshell就是以asp、aspx、php、jsp或者cgi等网页形式存在的一种命令执行环境,也将其称为一种网页后门。黑客入侵一个网站后,通常会将 asp、aspx、php 或 jsp 后门文件与网站 web 服务器目录下正常的网…

基础算法(三)——二分查找

二分查找 介绍 一种复杂度为O(logn)O(logn)O(logn)级别的查找算法,需要被查找的数列具有某种单调性质,其本质其实是搜索一个符合check条件的区间。 二分分为两种: 整数二分浮点数二分 核心思想: 首先讨论整数二分&#xff1…

Django搭建个人博客Blog-Day02

配置文件的介绍:dev.py(原来的setting.py文件)# django的配置文件中的配置项是什么意思? import os # 导入模块# Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR os.path.dirname(os.path.d…

测牛学堂:软件测试学习之python调试和判断嵌套

python中调试代码 在python中,使用debug来调试代码。 我们使用debug的目的,就是可以查看代码的执行过程。 步骤: 1 打断点。打断点是开发的术语,类似于打标记,debug会让程序在你打断点的地方停止执行。 如果要查看代码…

RabbitMQ(六)消息应答和持久化

目录一、RabbitMQ 消息应答二、RabbitMQ 持久化1.交换机的持久化2.队列的持久化3.消息的持久化4.持久化问题官网地址:https://www.rabbitmq.com/ 下载地址:https://www.rabbitmq.com/download.html 一、RabbitMQ 消息应答 ​ 执行一个任务可能需要花费…

petitlyrics 歌词提取 有感

想做一下歌曲的时间轴,搜歌词搜到了这个网站。奇怪的是看前端代码和network监听请求都不能获得完整歌词。如 https://petitlyrics.com/lyrics/934773a. 歌词截图如下:b. 控制台查看前端代码只有部分歌词c. Network查看请求数据,发现是日语对应…

小白和设计师都能用的 3D 渲染神器 #Rotato

“我非常喜欢它。它为我节省了很多时间,而不必在 Adobe After Effects 等应用程序中挣扎。”——Dominik Sobe on Product HuntRotato 是什么?Rotato 是一款功能强大的 3D 样机渲染神器,支持 PNG 、JPG 、 avi、mov 、mp4 等多种格式。不仅能…

10分钟在 Rainbond 上部署 mall 电商项目

很多小伙伴在学习 mall 电商项目时,都会在部署上折腾许久,虽然目前已经提供了很多种部署方式,比如 在 Linux 上部署 mall 、使用 Docker 或 DockerCompose 部署 mall ,但对于正在学习的我们都显得比较复杂,需要理解并学…

Vue.js组件编程的知识要点

在C/S编程中,对程序员来说,组件编程是一个不能忽视或者越过的技术能力,特别是自定义的组件编程以及构建基础组件库。虽然组件编程不是必须的,全部使用系统或者别人的组件(控件)也可以完成系统的开发&#x…

使用Python根据原始Excel表格批量生成目标Excel表格

点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤亭台六七座,八九十枝花。大家好,我是Python进阶者。一、前言前几天在帮助粉丝解决问题的时候,遇到一个简单的小需求&#…

程序员如何通过兼职赚钱?有哪些渠道?

程序员的工资是没有网上说的那么夸张。 就我自己来说,在刚刚工作的那几年,月薪没有超过1万块钱。但是刚刚来到大城市,这点工资连我交房租都不够,生存都成了问题。于是我开始考虑进行兼职,虽然在最开始的几个月也只能有…

(Week 11)综合复习(C++,图论,动态规划,搜索)

目录汤姆斯的天堂梦(C,Dijkstra)题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示解题思路:[蓝桥杯 2022 国 A] 环境治理(C,Floyd)题目描述输入格式输出格式样例 #1样例输入 #1样例输…

工控安全—工控常见协议识别

文章目录一、Nmap常见参数介绍二、工控常见协议识别三、工控设备指纹识别3.1 S73.2 Modbus3.3 IEC 60870-5-1043.4 DNP33.5 EtherNet/IP3.6 BACnet3.7 Tridium Niagara Fox3.8 Crimson V33.9 OMRON FINS3.10 PCWorx3.11 ProConOs3.12 MELSEC-Q四、测试一、Nmap常见参数介绍 -s…

STM32F411CE驱动Xbox摇杆

外观 引脚说明和原理 GND-GND 5V-5V VRX-ADC1通道1 VRX-ADC1通道2 SW独立按键-单片机的输入检测 本质上这个遥感就是集成了一个按键和两个电位器,遥感转动改变电位器也会转动,电压输出的值也就不一样,通过检测数值可自定义的做出判断&a…

linux发送tcp/udp请求

本文章介绍下通过nc工具和iperf工具,发送tcp/udp请求一、nc工具(netcat工具)这个工具linux系统默认是自带的,以下是命令的常用参数1.1 发送tcp请求在服务端监听端口nc -l port客户端连接并发送请求nc -v host port在服务端收到了信…

javaWeb 会话和跟踪

会话 用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。 会话跟踪 HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视…