作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个 Master Master redis 集群 3 (node1,node2,node3)。我正在使用 Redission用于跨 JVM 的分布式锁定的客户端。现在根据RedLock由 Redission 实现的算法,它尝试在大多数节点中获取锁(在我的例子中,2 是大多数节点),它使用循环算法进行负载平衡。现在,如果我们阻止节点 2 或节点 3 的网络,这种锁定机制可以正常工作。但是如果我们阻止节点 1 的网络,那么它将失败并出现以下错误
Exception in thread "main" org.redisson.client.RedisNodeNotFoundException: No node for slot: 15087 and command (EVAL)
at org.redisson.connection.MasterSlaveConnectionManager.getEntry(MasterSlaveConnectionManager.java:578)
at org.redisson.connection.MasterSlaveConnectionManager.connectionWriteOp(MasterSlaveConnectionManager.java:563)
at org.redisson.command.CommandAsyncService.async(CommandAsyncService.java:368)
at org.redisson.command.CommandAsyncService.evalAsync(CommandAsyncService.java:334)
at org.redisson.command.CommandAsyncService.evalWriteAsync(CommandAsyncService.java:282)
at org.redisson.RedissonLock.tryLockInnerAsync(RedissonLock.java:207)
at org.redisson.RedissonLock.tryAcquire(RedissonLock.java:139)
at org.redisson.RedissonLock.tryLock(RedissonLock.java:225)
at com.seamless.common.cache.distributed.LockManager.getLock(LockManager.java:37)
at com.testlock.app.App.main(App.java:34)
下面是我如何创建 Redission 客户端
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger;
import org.redisson.ClusterServersConfig;
import org.redisson.Config;
import org.redisson.ReadMode;
import org.redisson.Redisson;
import org.redisson.RedissonClient;
import org.redisson.core.RLock;
public class LockManager {
private static final Logger LOG = Logger.getLogger(LockManager.class);
private RedissonClient redissonClient;
LockManager(List<String> nodes){
Config config = new Config();
ClusterServersConfig serverConfig=config.useClusterServers();
serverConfig.setReadMode(ReadMode.MASTER);
for(String node :nodes){
serverConfig.addNodeAddress(node);
}
redissonClient = Redisson.create(config);
}
public boolean getLock(final String lockKey,int timeout){
RLock lock=redissonClient.getLock(lockKey);
try {
return lock.tryLock(0, timeout, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
LOG.error("Error getting lock "+e.getMessage());
}
return false;
}
public void releaseLock(final String lockKey){
RLock lock=redissonClient.getLock(lockKey);
if(lock.isHeldByCurrentThread())
lock.unlock();
}
}
最佳答案
你必须使用 RedissonRedLock
和 RedLock 算法的 3 个锁:
RLock lock1 = redisson.getLock("lock1");
RLock lock2 = redisson.getLock("lock2");
RLock lock3 = redisson.getLock("lock3");
RedissonRedLock lock = new RedissonRedLock(lock1, lock2, lock3);
lock.lock();
//...
lock.unlock();
关于java - 如果集群中的第一个节点关闭,Redis 客户端 (Redission) 将停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36747551/
前言 一些项目初期出于简单快速,都是做单机开发与部署,但是随着业务的扩展或对可用性要求的提高,单机环境已不满足需求。单机部署往多机部署切换,其中可能存在的一个重要环节就是session的共享(如果
我有一个 Master Master redis 集群 3 (node1,node2,node3)。我正在使用 Redission用于跨 JVM 的分布式锁定的客户端。现在根据RedLock由 Red
我是一名优秀的程序员,十分优秀!