spring boot 接入 redis cluster 需配置集群节点、使用 redisclusterconfiguration 构建连接工厂、显式创建支持集群的 rediscachemanager,并注意键名分组、跨 slot 限制及拓扑自动刷新等细节。

在 Spring Boot 中接入 Redis Cluster,核心是让应用能自动识别集群拓扑、支持节点故障转移、正确路由请求,并与 Spring Cache 体系无缝协作。不是简单换掉单机配置,而是要理解集群通信机制和 Spring 的抽象层适配逻辑。
依赖与基础配置要到位
必须引入 spring-boot-starter-data-redis,并显式添加连接池依赖(如 Lettuce 或 Jedis):
- Lettuce 是 Spring Boot 2.0+ 默认推荐的客户端,线程安全、支持响应式,适合高并发场景;
- 若用 Jedis,需额外引入
jedis和commons-pool2,但要注意 Jedis 实例非线程安全,需靠连接池管理; -
spring.redis.cluster.nodes必须填全至少三个主节点地址(如192.168.1.10:7001,192.168.1.10:7002,192.168.1.10:7003),Spring 会通过这些节点自动发现整个集群; -
spring.redis.cluster.max-redirects建议设为 3~5,避免重定向链过长导致超时。
RedisConnectionFactory 要用集群专用类型
不能复用单机的 RedisStandaloneConfiguration,必须使用 RedisClusterConfiguration 构建连接工厂:
- 配置类中通过
@Value注入节点列表,解析成List<redisnode></redisnode>; - 创建
LettuceConnectionFactory(或JedisConnectionFactory)时传入该配置; - 若需自定义连接池参数(如最大空闲、最小空闲、超时时间),可通过
LettuceClientConfigurationBuilder设置; - 务必启用
validateConnection = true,确保启动时校验集群连通性。
缓存管理器(CacheManager)要适配集群语义
直接使用默认的 RedisCacheManager 可能不生效——它默认按单机逻辑初始化。应显式构建支持集群的缓存管理器:
- 基于
RedisCacheWriter的RedisCacheWriter.nonLockingRedisCacheWriter()创建实例; - 用
RedisCacheConfiguration设定通用过期时间(如entryTtl(Duration.ofMinutes(30)))、序列化方式(建议用GenericJackson2JsonRedisSerializer); - 将配置与
RedisCacheWriter组装为RedisCacheManager,并注册为@Bean; - 开启
@EnableCaching后,@Cacheable注解就能走集群缓存了,无需改业务代码。
关键细节不能忽略
集群模式下有些行为和单机不同,容易踩坑:
- 键名必须包含大括号
{}才能保证同组 key 落在同一 slot(如user:{1001}:profile),否则哈希计算可能分散到多个节点; - 不支持跨 slot 的原子操作(如
MGET多个无共同前缀的 key),会抛RedisClusterException; - 批量操作(
multiGet、multiSet)需确保 key 属于同一 slot,否则降级为多次单 key 请求; - 集群节点变更(如扩缩容)后,Lettuce 会自动刷新拓扑,但旧连接可能短暂失效,建议配合
ReadFrom.REPLICA_PREFERRED提升读可用性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











