【Redis】Redis实现分布式锁解析与应用(Redis专栏启动)

news2024/11/17 9:54:17

 

📫作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C++及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。

        

📫 热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长。

        

🏆 InfoQ签约作者、CSDN专家博主/后端领域优质创作者/内容合伙人、阿里云专家/签约博主、51CTO专家 🏆

        

🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~ 


专栏系列(点击解锁)

学习路线(点击解锁)

知识定位

🔥MySQL从入门到精通🔥

MySQL从入门到精通

全面讲解MySQL知识与实战

🔥计算机底层原理🔥

深入理解计算机系统CSAPP

构件计算机体系和计算机思维

Linux内核源码解析

围绕Linux内核讲解计算机底层原理与并发

🔥数据结构与企业题库精讲🔥

数据结构与企业题库精讲

结合工作经验深入浅出,适合各层次,笔试面试算法题精讲

🔥互联网架构分析与实战🔥

企业系统架构分析实践与落地

行业前沿视角,专注于技术架构升级路线、架构实践

互联网企业防资损实践

金融公司的防资损方法论、代码与实践。

本文目录

本文导读

一、什么是分布式应用

1、分布式应用

2、分布式系统的 CAP 理论

2.1、一致性(Consistency)

2.2、可用性(Availability )

2.3、分区容错性(Partition Tolerance)

2.4、CAP的选择

二、什么是分布式锁

1、锁的三大特性

2、分布式锁应该具备哪些条件

三、Redis实现分布式锁

1、setnx命令

2、get命令

3、getset命令

4、del命令

5、Redis分布式锁原理(基于Redisson)

总结


本文导读

本文讲解什么是分布式应用,分布式应用的CAP理论,同时说明什么是分布式锁,分布式锁需要具备哪些特征,最后使用Redis进行分布式锁实战与Redisson源码的解析。由浅入深带领读者建立完整的Redis分布式锁的理论知识。

一、什么是分布式应用

1、分布式应用

《分布式系统原理和范型》中分布式系统的定义如下:分布式系统是几个独立计算机的集合,对于用户来说,这些计算机就像一个单独的相关系统。

从开发的角度来看,两个程序运行在两个主机的进程上,它们相互协作,最终完成相同的服务(或功能)。理论上,由这两个程序组成的系统也可以称为“分布式系统”。

2、分布式系统的 CAP 理论

一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。

2.1、一致性(Consistency)

一致性指“all nodes see the same data at the same time”,即所有节点在同一时间的数据完全一致。

一致性是因为多个数据拷贝下并发读写才有的问题,因此理解时一定要注意结合考虑多个数据拷贝下并发读写的场景。

2.2、可用性(Availability )

可用性指“Reads and writes always succeed”,即服务在正常响应时间内一直可用。

好的可用性主要是指系统能够很好的为用户服务,不出现用户操作失败或者访问超时等用户体验不好的情况。可用性通常情况下可用性和分布式数据冗余,负载均衡等有着很大的关联。

2.3、分区容错性(Partition Tolerance)

分区容错性指“the system continues to operate despite arbitrary message loss or failure of part of the system”。

即分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性或可用性的服务。

2.4、CAP的选择

在分布式系统中,P是不可避免的。如果不选择P,一旦发生分区错误,整个分布式系统将完全不可用。因此,对于分布式系统,我们只能考虑在发生分区错误时如何选择一致性和可用性。

根据一致性和可用性的不同选择,开源分布式系统通常分为CP系统和AP系统。

举个例子:当我们构建支付系统时,例如账户余额,必须保持一致。此时,您应该考虑选择C。但是,成员的名称和成员的付款设置不需要考虑强一致性,可以选择可用性A。 

二、什么是分布式锁

分布式锁是一种跨进程的,跨机器节点的一种互斥锁。保证在多个机器节点(分布式系统中)对共享资源访问的一个排他性

分布式锁和线程锁的本质是一样的。线程锁的生命周期是单进程多线程。分布式锁的生命周期多进程多机器节点.

1、锁的三大特性

排他性:同一时刻只能一个节点访问共享资源。

可重入性:允许一个已经获得锁的线程,在没有释放锁之前重新去获得锁

锁的获取和释放的方法,锁的失效机制避免死锁的一个问题

2、分布式锁应该具备哪些条件

在分布式系统环境中,一台机器的一个线程一次只能执行一个方法

高可用的锁获取和释放

高性能锁获取和释放

具有可重入特性(可以理解为可重入,可以同时使用多个任务,而不必担心数据错误)

具有锁定失败机制,即自动解锁以防止死锁

具有非阻塞锁特性,即如果没有获得锁,它将直接返回获得锁的失败

三、Redis实现分布式锁

1、setnx命令

set if not exists,当且仅当 key 不存在时,将 key 的值设为 value。若给定的 key 已经存在,则 SETNX 不做任何动作。

返回1,说明该进程获得锁,将 key 的值设为 value;返回0,说明其他进程已经获得了锁,进程不能进入临界区。

setnx lock.key lock.value

2、get命令

获取key的值,如果存在,则返回;如果不存在,则返回nil。

get lock.key

3、getset命令

该方法是原子的,对key设置newValue这个值,并且返回key原来的旧值。

getset lock.key newValue

4、del命令

删除redis中指定的key。

del lock.key

5、Redis分布式锁原理(基于Redisson)

Redis分布式锁被广泛使用。本质上,分布式锁的目标是在Redis中占据一把“钥匙”。当其他进程想要占用一个密钥时,它们必须放弃,或者在发现已经存在密钥时重试。

加锁机制:

setnx(set if not exists)指令只能由一个客户端使用,因为setnx 需要锁定客户端,如果这个客户端面向Redis群集,它将首先根据哈希节点选择一台机器,只选择了一台机器,然后将向Redis发送一个lua脚本(lua脚本可以保证原⼦性)。

锁定互斥机制:

如果客户端 B 此时试图锁定,它将执行相同的 lua 脚本。第一个判断将执行“exists myLock”,并发现 myLock 键已经存在。然后,第二个确定myLock密钥的哈希数据结构是否包含客户端B的ID。然后,客户端B将获得 pttl myLock 返回的一个数字,表示myLock密钥的剩余寿命。此时,客户端B将进入while循环,并尝试重复锁定。

释放锁机制:

执行lock Unlock(),可以释放分布式锁。释放逻辑是:每次myLock数据结构中的锁数减少1。如果锁数为0,则客户端不再持有锁。此时,“del MyLock”命令用于从Redis中删除密钥。然后另一个客户端B可以尝试完成锁定。

总结

本文讲解什么是分布式应用,分布式应用的CAP理论,同时说明什么是分布式锁,分布式锁需要具备哪些特征,最后使用Redis进行分布式锁实战与Redisson源码的解析。由浅入深带领读者建立完整的Redis分布式锁的理论知识。

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

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

相关文章

java版商城+Spring Cloud+SpringBoot+mybatis+uniapp b2b2c o2o 多商家入驻商城 直播带货商城 电子商务

一个好的SpringCloudSpringBoot b2b2c 电子商务平台涉及哪些技术、运营方案?以下是我结合公司的产品做的总结,希望可以帮助到大家! 搜索体验小程序:海哇 1. 涉及平台 平台管理、商家端(PC端、手机端)、买…

助农销售平台毕业设计,农产品销售管理系统设计与实现,毕业设计怎么写论文源码开题报告需求分析怎么做

项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于web网页的多用户商城系统,整个网站项目使用了B/S架构,基于java的springboot框架下开发;用户通过登录网站,查询商品,购买商品,下单&…

ElasticSearch-7.17支持两种客户端连接方式(RestHighLevelClient 和Elasticsearch Java API)

学习es时发现了一个大问题,学习的版本为7.8.0(尚硅谷yyds),自己使用的是7.17.8,但是最新的版本已经是8.5X了(心累,怎么升级这么快)。 因为目前用的还是jdk1.8,所以就按照…

Blazor组件自做十二 : Blazor Pdf Reader PDF阅读器 组件

原文链接 [https://www.cnblogs.com/densen2014/p/16954812.html] Blazor Pdf Reader PDF阅读器 组件 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IChv1OZ2-1670428567016)(https://img.shields.io/nuget/v/BootstrapBlazor.PdfReader.svg?styl…

【YOLOX 论文+源码解读】YOLOX: Exceeding YOLO Series in 2021

目录前言一、整体网络架构二、改进点1.1、解耦头1.2、Anchor Free1.3、SimOTA三、源码解析3.1、Backbone3.2、Neck3.3、head3.4、预测:decode_outputs3.5、训练:get_losses3.5.1、准备工作:get_output_and_grid3.5.2、get_losses函数&#xf…

神操作!竟然有人用Python在Excel中画画,女神看了直呼震惊

十字绣大家都知道吧,今天咱们来玩个电子版的十字绣。 用 Python 读取图片的像素值,然后输出到 Excel 表格中,最终形成一幅像素画,也就是电子版的十字绣了。 准备 既然要读取图片,那就需要用到 Pillow 库&#xff0c…

做更真实的实验!艾美捷Caspase-1活性分析试剂盒方案

FLICA 是通过检测来评估细胞死亡的有力方法体外凋亡。免疫化学技术(ICT)FLICA 荧光标记的抑制剂与活性半胱天冬酶共价结合的CAspa酶1,2。FLICA测量细胞内的凋亡过程,而不是副作用,如磷脂酰丝氨酸的翻转,并消除假阳性的…

iOS视频编码实战VideoToolbox

需求 iOS中编码视频数据,一般情况而言一个项目仅需要一个编码器,不过有时特殊需求可能需要两个编码器同时工作.本例中实现了编码器类.仅通过指定不同编码器的枚举值就可以快速生成需要的编码器,且支持两个编码器一起工作. 实现原理: iOS中利用VideoToolBox框架完成视频硬编码…

TS201的Flag输出状态控制LED亮灭原理和例程(含参考代码)

目的: 理解FLAG可编程作为输入输出引脚,并且能够利用按键进行相应FLAG(FLAG0,FLAG1)标志的输入来相应的FLAG标志(FLAG2,FLAG3)输出来控制与之相连的LED。掌握外部中断和定时器中断的设置以及其响应过程,理解外部硬件可…

hevc帧内planer预测模式和角度预测模式

帧内planer预测模式 planer预测模式适用于纹理相对平缓的图像区域,对于各个编码宏块而言,它不但能保持图像宏块边界良好的连续性。而且可以利用平面梯度信号随像素值的变化趋势而变化,在Planer预测模式下,可以将预测像素Px,y 看作…

企业应收账款管理存在的问题及对策

应收账款也就是信用交易,企业应收账款的产生是企业采取信用销售方式的必然结果。 现如今信用交易已经成为企业提高竞争力、扩大销售的必要手段,它充分挖掘和利用了企业的现有生产能力,扩大了销售量,增加了产品的市场份额&#xf…

潮玩积木国产化浪潮里,“中国积木”的自证之路

随着Z世代的崛起,潮玩从小众兴趣领域进入大众视野。 其中,作为年轻人喜爱的潮流品类之一,拼搭积木正在成为潮玩赛道的新风口。 哪怕疫情影响下,作为非必需消费品的积木仍然保持着中高速市场增长,足以被视为消费领域的…

[附源码]计算机毕业设计路政管理信息系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

ChatGPT入门指南

ChatGPT入门指南什么是ChatGPT?为什么ChatGPT意义重大?如何使用ChatGPT什么是ChatGPT? ChatGPT是基于聊天的生成预训练transformer模型的缩写,是一个强大的工具,可以以各种方式使用,以提高您在许多领域的生…

【Python】基础语法 3 (函数)

函数详解1. 函数是什么2. 语法格式3. 函数参数4. 函数返回值5. 变量作用域6. 函数执行过程7. 链式调用8. 嵌套调用9. 函数递归10. 参数默认值11. 关键字参数1. 函数是什么 编程中的函数和数学中的函数有一定的相似之处。 数学上的函数,比如 y sinx,x 取…

如何创建微信小程序?【创建小程序】

如何创建微信小程序呢?这是很多没有小程序的小伙伴经常问的问题,现在小程序给我们带来很多便利,而且很多企业公司也会有自己的小程序提供给他们的客户使用。那么创建微信小程序的步骤是什么呢,下面跟大家说说如何创建微信小程序。…

centos 模拟路由器功能实现内网和外网的联通

如下图的网络结构 192.168.65.128是一个windows主机,仅链接vmnet1的网卡。属于内网,无法连接外网,路由如下: IPv4 路由表 活动路由: 网络目标 网络掩码 网关 接口 跃点数 127.0.0.0 255.…

飞剪、追剪算法详细图解(附PLC完整源代码)

谈到运动控制就离不开编码器,有关编码器测速,测距的相关内容,大家可以查看专栏的其它文章,和飞剪控制息息相关的编码器测速,请参看下面的博客,链接如下: 如何通过编码器信号计算输送线/输送带线速度(飞剪、追剪算法基础)_RXXW_Dor的博客-CSDN博客不同品牌PLC如何采集…

Acrel-2000Z电力监控系统在重庆五桂堂历史文化商业街区的应用-Susie 周

1、项目概述 据悉原五桂堂街是一条上百年的地地道道的涪陵“老街”,北起火神庙(后来的铁器社)西侧,南止天主堂大门前横街尽头,长约200米,宽约2米,该项目建设地点位于重庆市涪陵区敦仁街道望栏桥…

设备树(Device Tree)

设备树介绍: 设备树是一个描述设备硬件资源的文件,该文件是由节点组成的树形结构。如下: / { node1 { a-string-property "A string"; a-string-list-property "first string", "second string"; // hex is …