spring boot 3 集成 redis 集群需严格配置 spring.redis.cluster.nodes(纯 host:port、逗号分隔、无空格/协议/localhost)、spring.redis.cluster.max-redirects(建议设为 master 节点数)、spring.redis.password 及 spring.data.redis.lettuce.pool.* 参数,且禁用 keys 等跨槽命令。

cluster.nodes 格式错一个空格就连不上
Spring Boot 3 的 RedisClusterConfiguration 解析器极其严格:节点列表必须是纯 host:port 格式,逗号分隔,**不能有空格、不能带 redis://、不能用 localhost(DNS 不稳时易失败)**。
常见错误示例:
-
127.0.0.1:7001 , 127.0.0.1:7002→ 中间空格导致整个配置被忽略 -
redis://127.0.0.1:7001→ 协议前缀不识别,静默跳过该节点 -
localhost:7001→ 某些容器或云环境 DNS 解析失败,连接超时
正确写法(YAML):
spring:
redis:
cluster:
nodes: 192.168.1.100:6379,192.168.1.101:6379,192.168.1.102:6379
⚠️ 所有节点必须是集群中可互相发现的 master 节点(非只读 slave),且集群状态为 ok(可通过 redis-cli --cluster check 验证)。
max-redirects 不设等于直接报 MOVED 异常
Lettuce 默认 max-redirects=0,意味着收到 MOVED 或 ASK 响应时直接抛 RedisCommandExecutionException,而不是尝试重定向。
这个值不是越大越好,而是要匹配集群实际拓扑深度:
- 设为集群 master 节点数(如 6 个 master 就配
spring.redis.cluster.max-redirects=6)最稳妥 - 设太小(如 1 或 2):跨槽操作频繁失败
- 设太大(如 50):无意义重试,最终仍超时,浪费资源
注意:spring.redis.cluster.command-timeout 已在 Spring Boot 3.x 废弃,统一用 spring.redis.timeout 控制 socket 级超时(建议 ≥2000ms)。
lettuce.pool 参数前缀写错就等于没配
Spring Boot 对 Lettuce 连接池参数使用固定前缀:spring.data.redis.lettuce.pool.*。写成 spring.redis.pool.* 或 spring.redis.lettuce.pool.* 都会静默失效 —— 连接池退化为默认值(max-active=-1,即无限制),线上可能引发连接泄漏或 Redis 拒绝服务。
关键参数推荐值(中等负载):
-
spring.data.redis.lettuce.pool.max-active: 16(Lettuce 基于 Netty,连接复用率高,无需像 Jedis 那样配很大) spring.data.redis.lettuce.pool.max-idle: 8spring.data.redis.lettuce.pool.min-idle: 2-
spring.data.redis.lettuce.pool.max-wait: 2000ms(超过则抛CannotGetRedisConnectionException)
密码和超时走全局前缀:spring.redis.password 和 spring.redis.timeout,与单机/集群通用。
KEYS * 类命令在集群下必然失败,这不是配置问题
执行 stringRedisTemplate.keys("*") 或 scan 时,Lettuce 会抛 UnsupportedOperationException,这不是你漏配了什么,而是 Redis 集群协议层的硬性限制:这些命令无法跨 slot 执行。
生产中必须规避:
- 禁用
KEYS(性能差且集群不支持) - 改用
scan时,确保 key 有固定前缀并路由到同一 slot(例如用{user}:123格式) - 聚合类操作(如
sort、mget)要求所有 key 在同一 slot,否则失败
真正容易被忽略的是:自动装配的 StringRedisTemplate 默认用 JDK 序列化,存进去的数据带 \xAC\xED\x00\x05t\x00 前缀 —— 这跟集群无关,但会让缓存数据不可读、体积膨胀,需单独配 GenericJackson2JsonRedisSerializer 替换。











