Spring boot refreshAfterWrite需要在spring启动应用程序中加载缓存

Spring boot refreshAfterWrite需要在spring启动应用程序中加载缓存,spring-boot,spring-cache,caffeine,Spring Boot,Spring Cache,Caffeine,我正在尝试将应用程序写入缓存,每隔几秒钟重新加载一次。我决定使用SpringBoot咖啡因,并获得了一个示例应用程序。但当我指定refreshAfterWrite属性时,它抛出异常:refreshAfterWrite需要一个LoadingCache spring: cache: cache-names: instruments, directory caffeine: spec: maximumSize=500, expireAft

我正在尝试将应用程序写入缓存,每隔几秒钟重新加载一次。我决定使用SpringBoot咖啡因,并获得了一个示例应用程序。但当我指定refreshAfterWrite属性时,它抛出异常:
refreshAfterWrite需要一个LoadingCache

spring:
    cache:
        cache-names: instruments, directory
        caffeine:
            spec: maximumSize=500, expireAfterAccess=30s, refreshAfterWrite=30s
为了解决这个问题,我提供了加载缓存Bean,但缓存完全停止工作:

@Bean
    public CacheLoader<Object, Object> cacheLoader() {
        return string -> {
            System.out.println("string = " + string);
            return string;
        };
    }

    @Bean
    public LoadingCache<Object, Object> loader(CacheLoader<Object, Object> cacheLoader) {
        return Caffeine.newBuilder()
                .refreshAfterWrite(1, TimeUnit.SECONDS)
                .build(cacheLoader);
    }
@Bean
公共缓存加载器缓存加载器(){
返回字符串->{
System.out.println(“string=“+string”);
返回字符串;
};
}
@豆子
公共加载缓存加载程序(缓存加载程序缓存加载程序){
return.newBuilder()
.refreshAfterWrite(1,时间单位为秒)
.build(cacheLoader);
}

我们有一些简单的方法来重新加载工作吗?

在这里总结一下,将咖啡因的
加载缓存
特性与Spring的缓存抽象结合使用没有多大意义,因为它们共享很多特性

@Cacheable
通常提供一种方法来标记检索缓存中尚不存在的元素的方法
LoadingCache
实现了相同的场景,要求您提供一个句柄,可以按id加载缺少的元素


如果您确实需要使用
加载缓存
,我会将
缓存
插入到您的代码中,并以编程方式与之交互。

Spring缓存抽象只为实现者提供
get(key,function)
,但这意味着函数可能会更改。为了自动刷新,Caffeine需要预先调用一个函数,但Spring的抽象无法提供这个函数。他们的建议是,他们的抽象用于简单/常见的情况,而不是增强它以支持更复杂的场景,用户应该更喜欢使用本机API。您是否将此
缓存
与缓存抽象一起使用?如果是这样,30秒后刷新缓存的用例是什么,因为其目的是在必要时负责获取数据的方法调用?如果您只是添加了一个过期,缓存抽象将在您下次尝试访问数据时调用您注释的方法,并且缓存项已过期。您好@StephaneNicoll,用例是每30秒重新加载一次数据更改,并将其保持缓存,这样当我们在30秒后收到请求时,它应该直接从缓存中获取最新信息。否则每隔30秒,缓存将过期,下一个请求将不得不再次加载数据,因此调用将需要时间。主要思想是保持数据预编译并避免运行时调用。那时不应该使用缓存抽象。如果您自己加载缓存,那么您正在复制缓存抽象已经完成的工作。当您标记一个方法
@Cacheable
时,您正在教导基础结构在缺少条目时应该调用什么。我们的要求也是在缺少缓存时加载数据(这正是
@Cacheable
所做的),并且无论我们已经缓存了什么,都应该每30秒刷新一次。因此,它是两种不同模式的混合,在
caffee
中受支持,但在其本机实现中受支持。