要在Spring Boot 3.1中启用真正异步、非阻塞的Redis响应式缓存,必须使用spring-boot-starter-data-redis-reactive而非传统starter,禁用spring-boot-starter-cache,配置ReactiveRedisCacheManager,并确保@Cacheable方法返回Mono/Flux。

要在Spring Boot 3.1项目中启用真正异步、非阻塞的Redis响应式缓存,必须绕过传统spring-boot-starter-data-redis的阻塞式API,改用reactive专属驱动与CacheManager实现,否则@Cacheable仍将走同步线程模型。
引入正确的Reactive依赖
打开pom.xml,删除普通Redis Starter,只保留以下两项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
⚠️注意:【spring-boot-starter-cache不能与reactive cache共存】——它会强制注册BlockingCacheManager,导致所有@Cacheable调用被降级为同步执行,彻底失去响应式意义。
配置Redis连接参数
在application.yml中写入:
spring:
redis:
host: 127.0.0.1
port: 6379
timeout: 5000ms
lettuce:
pool:
max-active: 20
此配置启用Lettuce原生Reactive连接池,不依赖Jedis或任何阻塞客户端。
声明Reactive CacheManager Bean
新建配置类CacheConfig.java:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
@Configuration
public class CacheConfig {
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory factory) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(10))
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
return RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(factory)
.cacheDefaults(config)
.build();
}
}
这个Bean返回的是真正的ReactiveRedisCacheManager,它内部使用Mono/Flux完成所有读写操作,不会阻塞Event Loop线程。
编写响应式Service并启用@Cacheable
第一步:在启动类上添加@EnableCaching注解;
第二步:定义一个返回Mono或Flux的方法:
@Service
public class UserService {
@Cacheable(value = "userCache", key = "#id")
public Mono<User> findById(String id) {
return userRepository.findById(id); // userRepository是ReactiveMongoRepository或R2DBC Repository
}
}
⚠️关键点:【方法返回类型必须是Mono或Flux】——只有这样,Spring Cache Infrastructure才会调用ReactiveCache接口的get()、put()等响应式方法,否则会回退到同步缓存逻辑。
验证缓存是否真正异步生效
① 启动应用后,调用一次findById("123"),观察日志是否出现"Writing to Redis"字样且无线程阻塞堆栈;
② 再次调用相同ID,检查是否跳过数据库查询,直接从Redis读取并返回Mono.just(...);
③ 使用curl -N http://localhost:8080/user/123观察响应头是否含"Content-Type: application/json"而非"text/event-stream"——说明未触发WebFlux流式传输,但缓存层已全程异步。

















