Java 如何在春季每30分钟更新一次缓存?

Java 如何在春季每30分钟更新一次缓存?,java,spring,spring-boot,caching,spring-cache,Java,Spring,Spring Boot,Caching,Spring Cache,我有以下声明: @Cacheable("books") public Book findBook(ISBN isbn) {...} 但我想每30分钟更新一次缓存。我知道我可以创建@Scheduled job来调用带注释的方法@cacheexecute(“books”) 此外,我认为在这种情况下,所有书籍都将被清除,但更可取的做法是只更新过时的数据(这些数据在>30分钟前放在缓存中) spring中有什么可以促进实现的功能吗?缓存实现为该任务提供了一个名为写后过期或生存时间的功能。不同的缓存实现

我有以下声明:

@Cacheable("books")
public Book findBook(ISBN isbn) {...}
但我想每30分钟更新一次缓存。我知道我可以创建@Scheduled job来调用带注释的方法
@cacheexecute(“books”)

此外,我认为在这种情况下,所有书籍都将被清除,但更可取的做法是只更新过时的数据(这些数据在>30分钟前放在缓存中)


spring中有什么可以促进实现的功能吗?

缓存实现为该任务提供了一个名为写后过期生存时间的功能。不同的缓存实现有很多差异。在春季,也没有人试图抽象或概括配置部分。以下是Spring中缓存的编程配置示例,如果您喜欢使用:

@配置
@启用缓存
公共类CachingConfig扩展了CachingConfigurerSupport{
@豆子
公共缓存管理器缓存管理器(){
返回新的SpringCache2kCacheManager()
.addCaches(
b->b.name(“books”).keyType(ISBN.class).valueType(Book.class)
.expireAfterWrite(30,时间单位:分钟)
.入口容量(5000);
}
}
有关这方面的更多信息,请参阅。其他缓存实现(如EHCache或咖啡因)也支持过期,但配置不同

如果您希望以“供应商中立”的方式配置缓存过期,则可以使用支持JCache/JSR107标准的缓存实现。该标准包括设置过期。一种方法如下所示:

@配置
@启用缓存
公共类缓存配置{
@豆子
公共JCacheCacheManager cacheManager(){
返回新的JCacheCacheCacheManager(){
@凌驾
受保护的集合加载缓存(){
集合缓存=新的ArrayList();
添加(新的JCacheCache)(
getCacheManager().createCache(“书籍”,
新的可变配置()
.setExpiryPolicyFactory(ModifiedExpiryPolicy.factoryOf(新的持续时间(时间单位:分钟,30))),
假),;
返回缓存;
}
};
}
}
JCache中的问题是,存在您需要的配置选项,这些选项不是标准的一部分。一个例子是限制缓存大小。为此,您始终需要添加特定于供应商的配置。对于cache2k(我是cache2k的作者),它支持JCache,配置被合并,这在中有详细描述。这意味着在编程级别上,您可以执行配置的“逻辑”部分,其中“操作”部分(如缓存大小)可以在外部配置文件中配置


不幸的是,供应商配置和通过JCache API的编程配置之间的互操作并不属于标准的一部分。因此,即使是100%兼容JCache的缓存也可能拒绝操作,并要求您只使用一种配置方式。

请参阅缓存实现的文档(默认情况下为EHCache)并调整时间以逐出超过30分钟的项目。@Kayaman在这里提到默认实现使用ConcurrentHashMapWell,这不太可能是可配置的。但这就是使用真正缓存的方式。看看咖啡因,以前的番石榴缓存,它有可配置的生存时间(TTL).Edit to add:这里有一个很好的链接:我不想编写代码来解决这个问题,应该是一个缓存配置解决方案。是的,我对支持JCache的实现非常感兴趣。如果您也能添加一个示例,我将不胜感激