如何在Java中为应用程序锁定Redis集群

Md *_*din 4 java redis distributed-lock jedis

我有两个Java应用程序(app1,app2)。两个应用程序都将JedisCluster客户端用于Redis集群。app1从Redis集群写入或读取数据。app2就像一个调度程序,仅将一些数据写入Redis集群。它在固定的时间间隔后运行。我必须确保当app2执行写操作时,直到app2完成整个写操作后,才为app1提供数据或为之写数据。我想在app2运行时为app1锁定Redis集群。当时app1是否获得异常无关紧要。

Kai*_*dul 5

看来您需要应用程序级锁来确保来自不同应用程序范围的线程安全操作,这与分布式锁几乎相同。对于Jedis,快速搜索即可生成Jedis-lock库。

Jedis jedis = new Jedis("localhost");
JedisLock lock = new JedisLock(jedis, "lockname", 10000, 30000);
lock.acquire();
try {
  // do some stuff
}
finally {
  lock.release();
}

System.out.println(jedis.isLocked());
System.out.println(jedis.isRemoteLocked());
Run Code Online (Sandbox Code Playgroud)

编辑

根据Jedis-lock的所有者(感谢此项目)的说法,该项目已不再维护/不再合并请求。该分叉现已得到积极维护,并具有以下新功能:

  • 新的SETAPI代替了旧的SETNX
  • 在上使用原子LUA脚本来锁定所有权安全 release()
  • 锁定支持 JedisCluster


Nik*_*rov 5

你尝试过Redisson的锁吗?它是一个基于 Redis 的框架。

它提供了Lock对象实现的java.util.concurrent.locks.Lock接口并且易于使用。

RedissonClient redisson = Redisson.create(config);

RLock lock = redisson.getLock("myLock");
lock.lock();
try {
   // ...
} finally {
   lock.unlock();
}
Run Code Online (Sandbox Code Playgroud)

它还提供锁对象的异步版本。