问题分析
redis.clients.jedis.exceptions.JedisRedirectionException 是 Jedis 客户端在与 Redis 集群交互时遇到的一个异常基类,它表示客户端需要重定向到集群中的另一个节点来执行操作。这个异常并不是直接抛出的,而是作为其他重定向异常(如 JedisMovedDataException 和 JedisAskDataException)的基类存在。这些重定向异常通常是由于客户端尝试在错误的节点上执行操作,而 Redis 集群要求操作必须在包含相关数据的节点上执行。
报错原因
当 Jedis 客户端与 Redis 集群交互时,如果客户端尝试在一个不包含所需数据的节点上执行操作,Redis 集群会返回一个重定向响应,告诉客户端去哪个节点上执行这个操作。Jedis 客户端在接收到这样的响应时,会抛出相应的重定向异常(如 JedisMovedDataException 或 JedisAskDataException),这些异常都继承自 JedisRedirectionException。
解决思路
解决 JedisRedirectionException 及其子类的正确思路是让 Jedis 客户端自动处理重定向逻辑。你应该使用 JedisCluster 而不是 Jedis 来与 Redis 集群交互,因为 JedisCluster 内部会处理这些重定向,并尝试在正确的节点上重新执行操作。
解决方法
方法一:使用 JedisCluster 代替 Jedis
当与 Redis 集群交互时,你应该始终使用 JedisCluster 而不是 Jedis。JedisCluster 会自动处理哈希槽和重定向,你不需要关心这些细节。
代码示例:
下滑查看解决方法
Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7000));
jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7001));
// ... 添加其他节点
JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes);
try {
// 执行操作,如获取键的值
String value = jedisCluster.get("mykey");
// ... 执行其他操作
} catch (JedisRedirectionException e) {
// 通常不需要直接捕获这个异常,因为 JedisCluster 会自动处理它
// 如果需要额外的处理逻辑,可以在这里添加
e.printStackTrace();
} finally {
if (jedisCluster != null) {
jedisCluster.close();
}
}
在这个示例中,即使 "mykey" 所在的哈希槽不在客户端最初连接的节点上,JedisCluster 也会自动处理重定向,并在正确的节点上执行 get 操作。通常你不需要直接捕获 JedisRedirectionException 异常,因为 JedisCluster 会自动处理它。如果你需要添加额外的处理逻辑(例如重试机制或日志记录),可以在 catch 块中添加相应的代码。但是,请注意不要干扰 JedisCluster 的自动重定向机制。

1万+

被折叠的 条评论
为什么被折叠?



