【Redis】Redis实现分布式锁解析与应用(Redis专栏启动)
创始人
2024-03-25 12:13:32
0

 

📫作者简介:小明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分布式锁的理论知识。

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...