首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果群集中的第一个节点关闭,Redis客户端(Redission)将停止工作

如果群集中的第一个节点关闭,Redis客户端(Redission)将停止工作
EN

Stack Overflow用户
提问于 2016-04-20 22:50:50
回答 1查看 1.3K关注 0票数 1

我有一个主redis集群,3个(node1,node2,node3)。我正在使用Redission客户端进行跨虚拟机的分布式锁定。现在,根据Redission实现的RedLock算法,它试图获取大多数节点(在我的例子中是2个节点)的锁,并使用轮询算法进行负载均衡。现在,如果我们阻塞node2或节点3的网络,这种锁定机制可以很好地工作。

代码语言:javascript
复制
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客户端的

代码语言:javascript
复制
    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();
}
}
EN

回答 1

Stack Overflow用户

发布于 2016-09-13 18:30:58

RedLock算法必须使用RedissonRedLock和3个锁:

代码语言:javascript
复制
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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36747551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档