You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:33:53