在WebFlux中如何使用缓存,缓存Mono和Flux
前言
在传统项目中,使用缓存框架对一个方法的返回做缓存那是再简单不过的事,缓存框架也是有多重选择,比如EHcache,Caffeine,jetcache,Guava Cache等等等。
但是当我真的把webflux应用到真实项目的时候才发现,因为响应式编程中的异步调度,几乎让所有的方法返回都套上了Mono<T>
, Flux<T>
,似乎之前的缓存框架没有那么简单能融合进项目中。
为此,我收集了常见的缓存框架对project-reactor(webflux中的响应式编程框架)支持,发现并没有我想的这么简单。
如下图:
框架名 | 支持情况 | 相关链接 |
---|---|---|
ehcache | 不支持 | Possibility to provide asynchronous or reactive cache in future versions |
jetcache | 不支持 | jetcache 支持 spring webflux 吗 |
reactor-extra | 最新版本已经停止更新 | reactor-addons |
caffeine | 支持 | Reactive types support for @Cacheable methods 但是要求是spring 6.1M4版本之后 |
方法一:使用caffeine + spring @Cacheable
这种方式的集成度最好,而且有spring团队的背书,相信性能和安全性也是有保证的,但是可惜的是,需要spring 6.1 M4之后的版本。
使用方式:
@SpringBootApplication
@Configuration
@EnableCaching
public class MakeSomeToolsApplication {
public static void main(String[] args) {
SpringApplication.run(MakeSomeToolsApplication.class, args);
}
@Bean
public CaffeineCacheManager caffeineCache() {
CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager();
Caffeine<Object, Object> caffeine = Caffeine.newBuilder()
.expireAfterWrite(60, TimeUnit.MINUTES);
caffeineCacheManager.setCaffeine(caffeine);
caffeineCacheManager.setAsyncCacheMode(true);
return caffeineCacheManager;
}
}