必须用spring-boot-starter-data-redis-reactive,否则ReactiveRedisConnectionFactory不会创建,导致ReactiveRedisTemplate注入失败;常见报错为“No qualifying bean of type 'ReactiveRedisTemplate' available”。

必须用 spring-boot-starter-data-redis-reactive,不能用带 -redis(非响应式)的 starter,否则 ReactiveRedisConnectionFactory 根本不会被创建,ReactiveRedisTemplate 会注入失败。
为什么 ReactiveRedisTemplate 不生效?
常见现象是启动时报 No qualifying bean of type 'ReactiveRedisTemplate' available,或 IDE 提示注入失败。根本原因不是代码写错了,而是依赖选错了:
- 用了
spring-boot-starter-data-redis→ 只提供RedisTemplate和同步连接工厂,ReactiveRedisConnectionFactory不在 Spring 容器里 - 漏掉
spring-boot-starter-webflux→ WebFlux 的响应式基础设施(如 Netty、Reactor 线程模型)未启用,Spring Boot 不会自动装配响应式 Redis 组件 - 同时引入
spring-boot-starter-web和spring-boot-starter-webflux→ Spring Boot 3 默认以 WebFlux 为主,但若类路径下存在 Servlet API(如 Tomcat),可能触发自动降级,需显式排除spring-boot-starter-web
application.yml 中的 redis 配置要点
WebFlux 场景下,spring.data.redis.* 配置项仍有效,但只作用于响应式 Lettuce 客户端(Spring Boot 3 默认就是 Lettuce)。注意以下三项必须显式设置或确认:
-
spring.data.redis.host/spring.data.redis.port:单节点直连时必填;集群则改用spring.data.redis.cluster.nodes -
spring.data.redis.password:有密码必须配,否则连接会因 AUTH 失败而静默断开(日志里只显示Connection closed) -
spring.data.redis.lettuce.pool.max-active:Lettuce 响应式连接池默认不启用,该配置无效;真正控制并发连接的是LettuceClientConfiguration中的io.lettuce.core.ClientOptions,通常无需手动调,除非压测时发现连接耗尽
自定义 ReactiveRedisTemplate Bean 的关键步骤
Spring Boot 3 自动配置了 ReactiveRedisTemplate<String, String>,但默认序列化器是 JdkSerializationRedisSerializer,会导致存入 Redis 的是二进制乱码,且无法被其他语言客户端读取。务必覆盖:
- 用
StringRedisSerializer处理 key,避免byte[]拼接出错;value 若为对象,推荐Jackson2JsonRedisSerializer(注意指定泛型类型,如new Jackson2JsonRedisSerializer<>(User.class)) - 不要直接 new
ReactiveRedisTemplate,必须通过ReactiveRedisTemplate.builder()构建,否则RedisSerializationContext无法正确绑定 - 示例片段:
@Bean public ReactiveRedisTemplate<String, User> reactiveRedisTemplate( ReactiveRedisConnectionFactory factory) { RedisSerializationContext.RedisSerializationContextBuilder<String, User> builder = RedisSerializationContext.newSerializationContext(new StringRedisSerializer()); RedisSerializationContext<String, User> context = builder .value(new Jackson2JsonRedisSerializer<>(User.class)) .build(); return ReactiveRedisTemplate.builder(factory).serializationContext(context).build(); }
集群模式下 ReactiveRedisTemplate 能用吗?
能,但要注意:spring-boot-starter-data-redis-reactive 底层用的是 Lettuce,它原生支持 Redis Cluster,不需要额外写 RedisClusterConfiguration —— 这是同步 RedisTemplate 才需要的。只要 application.yml 里配对了 spring.data.redis.cluster.nodes,自动配置的 ReactiveRedisConnectionFactory 就会走集群拓扑发现逻辑。
唯一容易忽略的是:集群节点列表必须包含至少一个 master 节点地址(不能全是 slave),否则初始化时会抛 Cannot retrieve cluster configuration;另外,密码必须统一配置在 spring.data.redis.password,Lettuce 不支持 per-node password。


















