[redisson]关于 Rlock 和 RedLock 的问题

2024-07-18 512 views
8

对于这两个,我有些不明白,提出几个问题,希望能得到解答。

运行环境:redis 是一个3主3从的集群,并只创建了一个 redisClient

1、使用 redisClient.getLock 方法,是根据 key 的名称选择一个实例并进行操作么?

2、使用 redissonClient.getRedLock 方法,传入的 Rlock 是上面所说的 redisClient 创建出来的,是否能达到 RedLock 算法所说的效果?

3、按照之前的理解,是否这样的一个 3主3从的集群,必须创建3个 redisClient ?

4、如果是创建了3个redisClient , 使用如 Semaphore 这样只支持在单个redisClient上创建的锁对象时,是只能由自行选择其中一个进行操作么?

谢谢

回答

6

RedisClient跟RedissonClient是两个概念,从整体上理解,我认为你问的问题是关于RedissonClient的,现基于这样的理解解答:

是的,Redisson会计算key相应的槽位并选择正确的实例操作。

能。但是你需要自己保证锁的分布情况。

不是。一个RedissonClient实例就够了。

Semaphore或任何一个对象(联锁除外)都是基于key实现的,在集群中这些对象都会有一个所属Redis实例。无论你创建多少个RedissonClient,在使用的时候都不需要关心它具体所属的Redis实例。

2

如果我没有理解错的话,在理想情况下,是要用3个redissonClient创建的 Rlock 对象会好一点。 那么在一个redissonClient 上面,除了默认的根据 Key Name 来选择槽位的 redis 实例,是否还有其他的方法来指定到某个实例创建 Rlock 对象?

6

不是。不论你用多少个RedissonClient,一个key名为ABC的锁始终是同一个槽位。

没有。这是Redis集群规范规定的,跟客户端无关。

2

按照我理解的 RedLock 算法的话,需要分别从3个redis实例中都创建ABC的锁,然后进行加锁,超过2个redis实例加锁成功,方为加锁成功,是这样吧?

我上面的意思是,要使用 RedissonRedLock ,我需要创建3个 redisson 实例并对应上其中一个redis主从,并用这 3个 redissonClient 创建 ABC 的 Rlock,用这三个Rlock 来创建一个 RedissonRedLock ,对吧?

4

不是这样的。首先Redisson实例并不针对某一个Redis主或从,一个Redisson实例可以实现操作集群中所有的Redis节点。Redisson内部会根据Redis集群的规范判断这个key所属的槽在哪个Redis节点,继而只在该节点上执行相关操作。

在绝大多数情况下,一个JVM使用一个Redisson实例就够了。

换而言之,一个key名为ABC的RLock锁,无论多大的集群,无论你创建多少个Redisson实例,它始终是在固定的一个Redis节点里,用3个Redisson实例操作同一个RLock这并不是RedLock算法的本意。

在使用RedissonRedLock的时候,你需要根据自己的需要,通过使用同一个Redisson实例,创建多个不同key名的RLock,然后再用这些RLock来创建一个RedissonRedLock,然后执行相关操作。

9

我懂了,非常感谢你耐心的解答!

5

是否在3主3从的一个redis集群里,必须手动创建3个lock然后包装为redlock,而且要保证3个lock通过hash crc正好映射到三个redis的master,才是redlock算法实现的分布式锁

8
       // 是否要保证lock1-lock2-lock3这三个key会映射到三个redis的master上
       RLock lock1=redissonUtil.getLock("lock1");
        RLock lock2=redissonUtil.getLock("lock2");
        RLock lock3=redissonUtil.getLock("lock3");
        RedissonRedLock redLock=new RedissonRedLock(lock1,lock2,lock3);
        redLock.lock();
        redLock.unlock();
8