
Redis Cluster 客户端收到 JedisMovedDataException: MOVED 表示请求的键所属哈希槽当前由另一节点负责,Jedis 未启用集群模式自动重定向,需使用 JedisCluster 替代单机 Jedis 实例。
redis cluster 客户端收到 `jedismoveddataexception: moved
在 Redis Cluster 架构中,数据按 16384 个哈希槽(hash slot)分散在多个节点上。当客户端向错误节点发送命令(如 GET user:1001),而该键实际映射到槽 12867、由 127.0.0.1:7002 节点托管时,目标节点会返回 MOVED 12867 127.0.0.1:7002 响应——这不是错误,而是集群的标准重定向机制。
关键问题在于:你正在使用普通 Jedis 实例连接集群,而非专为集群设计的 JedisCluster。单机 Jedis 不具备解析 MOVED 响应、更新槽映射缓存、自动重试的能力;它将 MOVED 视为异常并直接抛出 JedisMovedDataException。
✅ 正确做法:改用 JedisCluster,它内置集群智能路由:
// ✅ 推荐:使用 JedisCluster(自动处理 MOVED/ASK 重定向)
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("127.0.0.1", 7000)); // 只需提供至少一个启动节点
nodes.add(new HostAndPort("127.0.0.1", 7001));
nodes.add(new HostAndPort("127.0.0.1", 7002));
JedisCluster jedisCluster = new JedisCluster(nodes, 2000, 2000,
10, "mypass", new GenericObjectPoolConfig<>());
String value = jedisCluster.get("user:1001"); // 自动定位槽、重试,透明无感⚠️ 注意事项:
-
JedisCluster构造时传入的节点列表仅用于初始拓扑发现,后续会自动刷新集群状态; - 不要复用
JedisCluster实例跨线程(它本身是线程安全的,但内部连接池需合理配置); - 确保 Redis 节点已正确执行
CLUSTER MEET并完成槽分配(通过CLUSTER NODES和CLUSTER SLOTS验证); - 若仍报错,请检查防火墙、
bind/protected-mode配置,确保各节点间可互通且客户端能访问所有节点 IP+端口。
总结:MOVED 不是故障,而是集群的正常协同信号。根本解法是切换至语义正确的客户端——JedisCluster,而非手动解析重定向或硬编码节点路由。


















