如何在R2DBC中实现缓存?返回Mono时@Cacheable不生效
解决R2DBC中@Cacheable配合Mono返回值不生效的问题
问题根源
Spring Cache原生的@Cacheable注解是为同步方法设计的,默认不支持反应式类型(如Mono/Flux)。直接在返回Mono的方法上使用该注解,Spring无法正确处理反应式流的缓存逻辑,导致每次调用都会触发数据库查询。
解决方案
1. 引入反应式缓存依赖
如果用Redis作为缓存介质,需要替换为反应式版本的依赖(以Maven为例):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis-reactive</artifactId> </dependency>
2. 配置ReactiveCacheManager
配置支持反应式的缓存管理器,以Redis为例:
@Configuration public class ReactiveCacheConfig { @Bean public ReactiveCacheManager reactiveCacheManager(RedisConnectionFactory connectionFactory) { return RedisReactiveCacheManager.builder(connectionFactory) .cacheDefaults(CacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(10))) .build(); } }
3. 正确使用@Cacheable注解
确保@Cacheable关联到反应式缓存管理器,同时方法返回Mono类型:
@Cacheable(value = "stores", key = "#storeId", cacheManager = "reactiveCacheManager") Mono<Store> findById(int storeId);
额外注意事项
- 确认Spring Framework版本在5.2及以上(对应Spring Boot 2.2+),该版本开始原生支持反应式类型的缓存注解。
- 缓存的是
Mono内部的Store对象,而非Mono实例本身,第一次调用后,后续请求会直接从缓存返回解析后的结果,不再触发数据库查询。
内容的提问来源于stack exchange,提问作者Archimedes Trajano
相关产品推荐
相关产品推荐

