Spring Boot 3 默认支持 Redis 集群模式,只需正确配置 spring.data.redis.cluster.nodes(host:port 格式、逗号分隔)和 spring.data.redis.cluster.max-redirects(建议等于主节点数),自动装配的 RedisTemplate 即可直接使用,无需手写配置类或自定义连接工厂。

Spring Boot 3 默认支持 Redis 集群模式,无需手写配置类或自定义 RedisConnectionFactory,只要 spring.data.redis.cluster.nodes 配置正确,自动装配的 RedisTemplate 就能直接用。
application.yml 中必须设置 cluster.nodes
这是触发集群模式的唯一开关。Lettuce 客户端会根据该配置自动切换为集群连接逻辑,忽略 host 和 port 字段。
-
spring.data.redis.cluster.nodes必须是列表格式(YAML)或逗号分隔字符串(properties),至少包含 3 个主节点地址(推荐全量节点) - 每个节点格式为
host:port,例如192.168.1.10:7001,不能带redis://前缀 - 如果集群启用了密码,必须统一配置
spring.data.redis.password(Lettuce 不支持 per-node 密码) - 务必设置
spring.data.redis.cluster.max-redirects,建议值为集群主节点数(如 3 主 3 副则设为 3);太小会导致ClusterRedirectException,太大可能掩盖拓扑异常
不要手动声明 LettuceConnectionFactory Bean
Spring Boot 3 的自动配置(RedisAutoConfiguration)已内置集群适配逻辑。一旦检测到 cluster.nodes 存在,就会创建 RedisClusterConfiguration 并注入 LettuceConnectionFactory。
- 显式定义
@Bean LettuceConnectionFactory会覆盖自动配置,导致集群连接失败或退化为单节点行为 - 不需要调用
afterPropertiesSet(),也不需要手动 setpassword或timeout—— 这些都由RedisProperties自动传递 - 若需调整连接池参数,只改
spring.data.redis.lettuce.pool.*即可,与单机模式完全一致
StringRedisTemplate 和 RedisTemplate 都能直接注入使用
自动装配的模板默认使用 JDK 序列化,但操作方式与单机完全相同,无需任何适配代码。
- 直接
@Autowired private StringRedisTemplate stringRedisTemplate;即可,无需@Qualifier - 执行
stringRedisTemplate.opsForValue().set("k", "v")时,Lettuce 会自动计算 slot、路由到对应节点、处理 MOVED/ASK 重定向 - 注意:
KEYS *、SCAN等不支持跨槽操作的命令在集群下会抛出UnsupportedOperationException,不是配置问题,是 Redis 集群限制 - 涉及多 key 操作(如
MGET)要求所有 key 在同一 slot,否则需用{...}手动哈希标签对齐,例如MGET {user:1}:name {user:1}:age
常见错误现象和排查点
集群连不上、命令超时、返回空结果,大概率不是代码问题,而是配置或环境层面卡点。
- 启动时报
Unable to connect to Redis server:检查cluster.nodes是否填了不可达地址,或防火墙未开放集群总线端口(通常是redis-port + 10000,如 7001 → 17001) - 运行时报
ClusterTopologyRefreshFailedException:说明客户端无法通过CLUSTER NODES获取拓扑,确认所有节点已执行CLUSTER MEET且状态为connected - 部分 key 写入成功、部分报
MOVED后无响应:检查max-redirects是否过小,或集群正在做 failover 切换 - 使用
StringRedisTemplate存中文乱码:不是集群特有问题,是序列化器未指定 UTF-8,应在配置类中显式设置valueSerializer为StringRedisSerializer
最易被忽略的是集群总线通信和 max-redirects 的匹配关系 —— 节点数变了,这个值必须同步更新,否则重定向链断掉就静默失败。


















