redis7高级篇-基于redission在多机模式下实现分布式锁

Redisson是一个基于Redis的Java客户端,提供了分布式锁、可重入锁、公平锁、信号量和闭锁等工具,用于实现分布式环境下的并发控制。其分布式锁使用watchdog机制确保锁自动续期,防止锁无法释放。文章通过案例展示了如何在SpringBoot工程中集成Redisson,并使用RLock进行加锁、解锁操作,以及公平锁和信号量的使用方法。

一  RedLock算法

1.1 redisson分布式锁的缺点

 Redisson 只是对 Redis 单节点加锁实现分布式锁的,但分布式环境中的 Redis 一定采用的是多机部署(主从、哨兵或集群),那么在多机环境下存在问题:

1.客户端1从master获取了锁;

2.master宕机后,存储锁的key还没有来得及同步到slave上

3.slave升级为master。

4.客户端2从新的master获取到了对应同一个资源的锁(setnx k v)

造成问题:

客户端1和客户端2同时持有了同一个资源的锁。锁的独占互斥特性不满足、锁的安全性被打破针对这个问题,antirez设计了Redlock算法如下图

1.2 redlock的原理

1.redlock思想:

RedLock 是对集群的每个节点进行加锁,如果大多数节点(N/2+1)加锁成功,则才会认为加锁成功。 这样即使集群中有某个节点挂掉了,因为大部分集群节点都加锁成功了,所以分布式锁还是可以继续使用的。

2.作用

RedLock 算法旨在解决单个 Redis实例作为分布式锁时可能出现的单点故障问题,通过在多个独立运行的 Redis 实例上同时获取锁的方式来提高锁服务的可用性和安全性。

1.3 实现步骤

基于客户端的实现,是基于多个独立的Redis Master节点的一种实现(一般为5)。client依次向各个节点申请锁,若能从多数个节点中申请锁成功并满足一些条件限制,那么client就能获取锁成功。它通过独立的N个Master节点,避免了使用主备异步复制协议的缺陷,只要多数Redis的master节点正常就能正常工作,显著提升了分布式锁的安全性、可用性。

注意图中所有的节点都是master节点。加锁的消耗时间小于有效时间且加锁超过半数成功,就认为是成功。

1.3 实现步骤

具体流程:

a)获取锁

1.Key的默认有效时间为10s,即T0

2.获取当前时间T1,作为后续的计时依据

按顺序地,依次向5个独立的节点来尝试获取锁SET resource_name my_random_value NX PX 30000;

3.计算获取锁总共花了多少时间,判断获取锁成功与否,时间记为T2

当且仅当超过一半(N/2+1,这里是5/2+1=3个节点)的Redis master节点都获得锁,并且使用的时间小于锁失效时间时,锁才算获取成功。

4.当获取锁成功后,锁有效时间为T0=T0-(T2-T1),总的有效时间减去第三步算出来的消耗时间;

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

b)释放锁

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

https://zhuanlan.zhihu.com/p/518847774

https://zhuanlan.zhihu.com/p/676782382

【分布式缓存系列】集群环境下Redis分布式锁的正确姿势 - Learning hard - 博客园

【分布式缓存系列】集群环境下Redis分布式锁的正确姿势 - Learning hard - 博客园

【案例实战】SpringBoot整合Redisson实现RedLock分布式锁同步_redis同步锁-优快云博客

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值