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