Java Redis分布式锁(Redisson):如何跨服务器实例进行锁定?

Java Redis分布式锁(Redisson):如何跨服务器实例进行锁定?,java,caching,redis,distributed-caching,redisson,Java,Caching,Redis,Distributed Caching,Redisson,问题陈述: 花园里各种各样的植物 为运行多个实例的服务实现分布式锁定 在运行于1个主设备和2个从设备上的“redis”上进行锁定 实施: 服务实例1 RLock lock11 = redisson.getLock("lock11"); RLock lock12 = redisson.getLock("lock12"); RLock lock13 = redisson.getLock("lock13"); RedissonRedLock lock = new Re

问题陈述:

花园里各种各样的植物

为运行多个实例的服务实现分布式锁定

在运行于1个主设备和2个从设备上的“redis”上进行锁定

实施:

服务实例1

    RLock lock11 = redisson.getLock("lock11");
    RLock lock12 = redisson.getLock("lock12");
    RLock lock13 = redisson.getLock("lock13");

    RedissonRedLock lock = new RedissonRedLock(lock11, lock12, lock13);
    lock.lock();

    //...

    lock.unlock();
服务实例2

    RLock lock21 = redisson.getLock("lock21");
    RLock lock22 = redisson.getLock("lock22");
    RLock lock23 = redisson.getLock("lock23");

    RedissonRedLock lock = new RedissonRedLock(lock21, lock22, lock23);
    lock.lock();

    //...

    lock.unlock();
预期行为:

如果服务实例1获得了锁,那么服务实例2应该不能获得锁。(对于分布式锁定-这应该是正常行为)

问题:

Redis如何知道对象“lock11”将被创建为对象“lock21”的专有对象

我们(作为开发人员)需要为哈希冲突编程吗


注意:这两个对象将具有不同的哈希代码(服务实例1将不知道服务实例2对象的哈希代码)

如果您只有一个主对象,那么我建议使用不带RedisonRedlock对象的单锁。只需通过
redisson.getLock
方法获取它。您不需要管理哈希代码。Redisson在集群环境中为您做这件事。感谢@NikitaKoksharov,您的输入帮助。但是,我的问题仍然存在。。当服务实例1和2都执行redisson.getLock(“FixedString”)时,服务器知道这两个实例中只有一个应该被授予锁(通过能够使用“FixedString”)。从上面的示例中,Redis如何知道在对象“lock11”和对象“lock21”中,只有一个被授予锁(如何比较这两个锁的名称呢?Redis是一个单线程且速度极快的服务器。因此,如果一个客户端设置了值,另一个客户端由于原子性而不会这样做。Redisson lock使用此功能来保证只有一个Java线程会获得同名锁。在您的情况下,
lock11
lock21是不同的锁,因为它们有不同的名称,所以可以由两个不同的线程获取。在同一个Redis集群中,您不需要为此烦恼。只需使用一个名称即可