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");

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





