我试图从java连接到JedisCluster(ElastiCache Redis)。但我收到JedisConnectionException,群集中没有可达节点。
这是我连接到JedisCluster的代码
public static void main(String[] args) throws IOException{
final GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setMaxWaitMillis(2000);
poolConfig.setMaxTotal(300);
Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
jedisClusterNode.add(new HostAndPort("mycachecluster.eaogs8.0001.usw2.cache.amazonaws.com",6379));
jedisClusterNode.add(new HostAndPort("mycachecluster.eaogs8.0002.usw2.cache.amazonaws.com",6379));
JedisCluster jedisCluster = new JedisCluster(jedisClusterNode,poolConfig);
System.out.println("Cluster Size...." + jedisCluster.getClusterNodes().size());
try{
jedisCluster.set("foo", "bar");
jedisCluster.get("foo");
}
catch(Exception e){
e.printStackTrace();
}
finally{
jedisCluster.close();
}
}
运行此
后我得到的例外redis.clients.jedis.exceptions.JedisNoReachableClusterNodeException: No reachable node in cluster
at redis.clients.jedis.JedisSlotBasedConnectionHandler.getConnection(JedisSlotBasedConnectionHandler.java:57)
at redis.clients.jedis.JedisSlotBasedConnectionHandler.getConnectionFromSlot(JedisSlotBasedConnectionHandler.java:74)
at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:116)
at redis.clients.jedis.JedisClusterCommand.run(JedisClusterCommand.java:31)
at redis.clients.jedis.JedisCluster.set(JedisCluster.java:103)
我已经检查了
telnet mycachecluster.eaogs8.0001.usw2.cache.amazonaws.com 6379
如AWS Doc中所述,我得到了连接的回复。
这里有什么问题以及为什么我无法使用java连接到JedisCluster?
注意:
我使用的是jedis版本2.9.0
更新
在AWS 传输中的加密和静态加密
所以
Jedis jedis = null;
try{
jedis = new Jedis(URI.create("rediss://mycachecluster.eaogs8.0001.usw2.cache.amazonaws.com:6379"));
System.out.println(jedis.ping());
System.out.println("XXXXX: "+jedis.get("c"));
}
catch(Exception exception){
exception.printStackTrace();
}
finally{
jedis.close();
}
工作正常。但不是jedis集群。
答案 0 :(得分:2)
从t::s
:*:_t::T
开始,很明显您正在使用 Redis SSL Scheme 来创建Jedis的成功连接。但是JedisCluster还没有SSL支持。
对此有一个pending feature request。
答案 1 :(得分:0)
JedisCluster在连接启用了SSL的Redis集群服务器时遇到了一些问题。即使使用最新版本(截至2020年7月),我们也遇到了异常JedisNoReachableClusterNodeException
。有关各种服务器要求的配置的文章很少。
我们需要两种语言的库,一种使用Java,另一种使用Python。对于python,我使用了python redis-py-cluster。对于Java,最初我们尝试使用Jedis,然后尝试使用Jedis Cluster,但两者都没有帮助。 所以我发现了另一个图书馆
生菜
对于具有SSL支持的Redis集群服务器,配置非常简单,并且支持构建器模式来构造带有可选参数的连接对象。这是创建并连接到redis-cluster服务器的示例
RedisURI redisURI = RedisURI.Builder.redis("<<Redis Server primary endpoint>>", 6379).withSsl(true).withVerifyPeer(false).build();
RedisClusterClient redisClient = RedisClusterClient.create(redisURI);
StatefulRedisClusterConnection<String, String> conn = redisClient.connect();
List<KeyValue<String, String>> res_1= conn.sync().mget(keys...)_
conn.close();
但是请注意,如果redis服务器是单节点实例,那么即使Jedis库也很好用。