我想在Spring中使用Caffeine缓存创建一个缓存示例。我需要该高速缓存来异步刷新所有键,从外部服务获取数据,当数据准备就绪时,在没有任何停机时间的情况下将旧值与新值交换。使用该高速缓存提供的刷新机制似乎可以解决这个问题
@Bean
public AsyncLoadingCache<Object, Object> myCache() {
return Caffeine.newBuilder()
.maximumSize(cacheProperties.getProp())
.refreshAfterWrite(5, TimeUnit.MINUTES)
.recordStats()
.buildAsync(key -> cacheInitializer.fetchCacheValues());
}
在我的例子中,fetchCacheValues()是一个bean服务,它对其他服务进行外部调用,但该方法从未被调用,尽管该高速缓存成功初始化。
我是不是漏了什么。refreshAfterWrite()行为?有更好的选择吗?(我也试过使用预定作业和CachePut来做,但刷新时会出现一些停机时间)
1条答案
按热度按时间dxxyhpgq1#
在Caffein中,刷新一个键的工作原理与驱逐有点不同。在逐出的情况下,仅因为配置的时间过去,值被逐出。在刷新的情况下,它将仅标记为“准备刷新”。实际刷新将仅在(并且如果)获取值时被触发。换句话说,如果没有获取值,那么您的服务将永远不会运行。
希望能帮上忙。