Java不负责搭建Redis Cluster,仅通过JedisCluster等客户端连接已部署的6节点集群(3主3从),自动路由分片并验证槽分配。

Java 本身不负责搭建 Redis Cluster 集群,而是连接和使用已部署好的集群。真正搭建集群是运维或 DevOps 在 Linux 服务器(或容器)上完成的。Java 的角色是通过客户端(如 JedisCluster 或 Lettuce)正确接入、自动路由、读写分片数据。下面直接讲清楚关键环节:怎么搭集群、怎么配 Java 客户端、怎么验证分片是否生效。
Redis Cluster 集群必须先在服务端搭建好
最低生产可用配置是 6 个节点:3 主 + 3 从(不能少于 3 主,否则无法自动分配 16384 个槽)。所有节点需满足:
- 运行 Redis 5.0+(推荐 7.x),且 cluster-enabled yes 已开启
- 每个节点绑定真实 IP(非 127.0.0.1),端口互不冲突(如 7001–7006)
- 节点间网络互通(关闭防火墙或放行对应端口)
- 持久化建议开启 AOF(appendonly yes)
启动全部 6 个实例后,用 redis-cli 命令创建集群:
redis-cli --cluster create 192.168.1.10:7001 192.168.1.10:7002 192.168.1.10:7003 192.168.1.10:7004 192.168.1.10:7005 192.168.1.10:7006 --cluster-replicas 1执行后会自动分配哈希槽(0–16383)、建立主从关系,并生成 nodes-*.conf 状态文件。
立即学习“Java免费学习笔记(深入)”;
Java 使用 JedisCluster 连接集群
引入依赖(Maven):
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.4.3</version>
</dependency>
连接示例(自动发现、自动重试、无需指定全部节点):
只需提供至少一个可连通的节点地址,JedisCluster 会自动获取整个拓扑
- 传入一个 Set<HostAndPort>,包含 2–3 个主节点地址即可(提高初始发现鲁棒性)
- 不建议只传 1 个;避免该节点宕机导致初始化失败
- 连接池参数建议配置,例如 maxTotal=20、maxIdle=10
代码片段:
Set<HostAndPort> nodes = new HashSet<>();nodes.add(new HostAndPort("192.168.1.10", 7001));
nodes.add(new HostAndPort("192.168.1.10", 7002));
nodes.add(new HostAndPort("192.168.1.10", 7003));
JedisCluster jc = new JedisCluster(nodes, 2000, 2000, 5, "mypass", new GenericObjectPoolConfig());
jc.set("user:1001", "Alice");
String v = jc.get("user:1001"); // 自动路由到对应槽所在节点
验证分片是否真正生效
不能只看 set/get 是否成功,要确认数据确实落在不同节点上:
- 用 redis-cli -c -h 192.168.1.10 -p 7001 连任意节点,执行 cluster slots 查看槽分配情况
- 对同一个 key 执行两次 cluster keyslot user:1001,结果应固定(CRC16(key) % 16384)
- 手动存两个不同 key(如 user:1001 和 order:2001),再分别用 redis-cli -c 连不同端口查——能跨节点读取,说明集群内部重定向正常
注意:Java 客户端调用 jc.get("key") 时,底层已自动完成槽计算 → 节点定位 → 重定向(如有需要)→ 返回结果,业务代码完全无感知。
常见踩坑点提醒
Java 侧容易忽略但影响稳定的细节:
- 不要用 Jedis 单实例代替 JedisCluster:单实例无法识别槽、不会重定向,写错节点会报 MOVED 错误
- key 必须带大括号 {} 实现 hash tag:如 user:{1001}:profile 和 user:{1001}:settings 会被算到同一槽,支持 multi-key 操作
- 事务、Lua 脚本限制多:所有 key 必须在同一槽,否则报 CROSSSLOT 错误
- 连接池未 close 可能泄漏:JedisCluster.close() 会释放全部底层连接,务必在应用退出时调用

















