Redisson分布式锁学习总结:RedissonRedLock 是如何实现 RedLock 算法的?

本文详细介绍了RedissonRedLock的实现原理,它是基于RedLock算法的分布式锁实现。RedLock算法要求在N/2+1个Redis实例上成功加锁才能视为获取锁成功,以防止集群故障导致的锁失效问题。RedissonRedLock通过配置多个锁实例,实现了这一算法。文章还探讨了如何正确设置锁的key以确保它们分散在不同的Redis节点上,以及源码中关键方法的重写,如failedLocksLimit()、calcLockWaitTime()和unlock()。此外,文中提供了一个简单的使用示例,展示了如何创建和使用RedissonRedLock。

1、RedLock 算法

1.1、RedLock 算法是什么?

Redis 作者对于分布式锁提出的一种加锁算法,其实核心非常简单:假设redis集群中有N个redis节点,只有当客户端成功在 N/2+1 个实例中成功加锁成功,才算成功持有分布式锁。当然了,这算法里面还有很多其他的小细节,如果大家感兴趣,可以看看 redis 官网关于 RedLock 算法的介绍,是非常详细的。RedLock算法

那么,Redisson 有对应的实现么?

那是必须有的,各种锁都提供了,难道还会缺这个么?同时,我们可以在官网看到,官网对于 RedLock 算法的Java客户端实现,首推 Redisson。
在这里插入图片描述

1.2、为什么需要 RedLock 算法?

回头想想,为什么需要 RedLock 算法?

我们知道,之前提到的分布式锁有:可重入锁、公平锁、读写锁,他们其实底层都是根据key计算出一个槽(slot),这个槽可以对应到某个 Redis 集群的一个节点;那么就是说,这些分布式锁仅仅是在一个节点上加锁,那么下面的情况就会出现不同客户端持有锁:

  • Redis 集群是多主多从架构,假设客户端1在MasterNode1上成功持有锁[myLock],但不幸的是,MasterNode1突然宕机了,并且此时还未将数据完全同步给SlaveNode1(包括客户端1的加锁信息),那么当 SlaveNode1 被选举为新的 MasterNode1 后,其他客户端就可以在新的 MasterNode1成功持有锁[myLock]。

其实这个场景,redis 官网在介绍 RedLock 算法的时候也提到了~
在这里插入图片描述

正是因为可能出现上面的场景,导致不同客户端可同时持有同一把锁,所以才推出 RedLock 算法。

但是我们上篇文章不是介绍了可以同时持有N个资源的 RedissonMultiLock 么,感觉它的实现原理可以完成这个 RedLock 算法。确实,在 Redisson 中,RedissonRedLock 就是基于 RedissonMultiLock 上面做的扩展,并且仅仅重写了三方法,下面我们将简单介绍一下。

2、RedissonRedLock

2.1、使用demo:

public class RedissonRedLockDemo {
   
   

    public static void main(String[] args) {
   
   
        RedissonClient redissonClient = RedissonClientUtil.getClient("");
        RLock rLock1 = redissonClient.getLock("lock1");
        RLock rLock2 = redissonClient.getLock("lock2");
        RLock rLock3 = redissonClient.getLock("lock3");
        
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值