Spring Boot 3 中需手动配置 ReactiveRedisTemplate Bean:仅保留 spring-boot-starter-data-redis-reactive 依赖,删掉阻塞式依赖;在配置类中注入 ReactiveRedisConnectionFactory,使用 StringRedisSerializer 显式指定 key/value/hash 的序列化器,泛型不可用 Object;application.yml 配置须改用 spring.data.redis.* 前缀,否则连接失败。

ReactiveRedisTemplate 怎么配 Bean?
Spring Boot 3 默认不自动装配 ReactiveRedisTemplate,必须手动声明 Bean。它依赖 ReactiveRedisConnectionFactory,而后者由 spring-boot-starter-data-redis-reactive 自动提供——但前提是项目里没混入 spring-boot-starter-data-redis(阻塞式),否则可能触发条件冲突导致启动失败。
正确做法是:只保留响应式依赖,删掉阻塞式依赖;然后在配置类中显式定义 ReactiveRedisTemplate:
@Bean
public ReactiveRedisTemplate<string string> reactiveRedisTemplate(
ReactiveRedisConnectionFactory factory) {
RedisSerializationContext.RedisSerializationContextBuilder<string string> builder =
RedisSerializationContext.<string string>newSerializationContext()
.key(new StringRedisSerializer())
.value(new StringRedisSerializer())
.hashKey(new StringRedisSerializer())
.hashValue(new StringRedisSerializer());
return new ReactiveRedisTemplate(factory, builder.build());
}</string></string></string>
注意:不要用 Object 作泛型,否则序列化器无法对齐,运行时会抛 SerializationException。
application.yml 里 redis 配置路径变了?
Spring Boot 3 中,spring.redis.* 形式的配置已被废弃,必须改用 spring.data.redis.*。否则 ReactiveRedisConnectionFactory 拿不到 host/port,启动直接报 Cannot connect to Redis server。
典型正确写法:
spring:
data:
redis:
host: localhost
port: 6379
password:
database: 0
timeout: 5s
lettuce:
pool:
max-active: 20
max-idle: 10
min-idle: 0
如果连的是集群,要换成 spring.data.redis.cluster.nodes,且不能和单机配置共存。
为什么 Mono/Flux 操作总卡住或返回 null?
常见原因有三个:
-
ReactiveRedisTemplate的序列化器和实际存取类型不一致,比如 key 用了StringRedisSerializer,但代码里传了Long类型的 key,结果序列化后 Redis 里 key 是乱码,查不到值 - 忘记在 Controller 方法上加
@RestController或返回类型没用Mono/Flux,Spring WebFlux 不识别,走默认 Servlet 路径,返回空响应 - 在非响应式链路中调用阻塞方法(如
block()),尤其在 WebFlux 线程(如parallel或elastic)里调用,会导致线程挂起甚至超时
示例错误写法:
public Mono<string> getUser(String id) {
return reactiveRedisTemplate.opsForValue().get("user:" + id).block(); // ❌ block() 在 WebFlux 中禁止</string>
应改为纯响应式链路:
public Mono<string> getUser(String id) {
return reactiveRedisTemplate.opsForValue().get("user:" + id)
.defaultIfEmpty("not found"); // ✅</string>
ReactiveRedisTemplate 和 RedisRepository 选哪个?
两者定位不同:ReactiveRedisTemplate 是底层操作模板,适合细粒度控制 key 结构、TTL、Lua 脚本等;ReactiveRedisRepository 是基于注解的声明式抽象,要求实体加 @RedisHash,自动处理序列化与主键映射,但灵活性差。
如果你的业务需要:
- 缓存用户 session(key = "session:{id}",value = JSON 字符串)→ 用
ReactiveRedisTemplate - 持久化带索引的用户实体(如按 email 查询)→ 可考虑
ReactiveRedisRepository,但得配合@Indexed和ReactiveRedisOperations补充查询逻辑 - 执行限流脚本(
EVAL)→ 只能用ReactiveRedisTemplate.execute(),Repository不支持
多数真实场景下,ReactiveRedisTemplate 更可控,也更常被选用。
最后提醒一句:Lettuce 的响应式连接是共享的,别在 ReactiveRedisTemplate 上做同步重试或手动 close,这些动作由 Spring 容器和连接池统一管理。手动能关的只有 ReactiveRedisConnectionFactory,但一般也不该动。











