gst*_*low 5 java spring caching spring-boot spring-cache
我有以下声明:
@Cacheable("books")
public Book findBook(ISBN isbn) {...}
Run Code Online (Sandbox Code Playgroud)
但我想每 30 分钟更新一次缓存。我知道我可以创建 @Scheduled 作业来调用带注释的方法@CacheEvict("books")
另外,我想在这种情况下,所有书籍都将被清除,但更可取的是仅更新陈旧数据(在 30 分钟前放入缓存中)
春天有什么可以促进实施的吗?
缓存实现为此任务提供了一个名为“写入后过期”或“生存时间”的功能。不同的缓存实现有很大差异。在 Spring 中也没有尝试抽象或泛化配置部分。如果您喜欢使用cache2k,这里是 Spring 中缓存的编程配置示例:
@Configuration
@EnableCaching
public class CachingConfig extends CachingConfigurerSupport {
@Bean
public CacheManager cacheManager() {
return new SpringCache2kCacheManager()
.addCaches(
b->b.name("books").keyType(ISBN.class).valueType(Book.class)
.expireAfterWrite(30, TimeUnit.MINUTES)
.entryCapacity(5000);
}
}
Run Code Online (Sandbox Code Playgroud)
有关此内容的更多信息,请参阅《cache2k 用户指南 - Spring 框架支持》。其他缓存实现(例如 EHCache 或 Caffeine)也支持过期,但配置不同。
如果您想以“供应商中立”的方式配置缓存过期,则可以使用支持 JCache/JSR107 标准的缓存实现。该标准包括设置有效期。一种方法,看起来像这样:
@Configuration
@EnableCaching
public class CacheConfiguration {
@Bean
public JCacheCacheManager cacheManager() {
return new JCacheCacheManager() {
@Override
protected Collection<Cache> loadCaches() {
Collection<Cache> caches = new ArrayList<>();
caches.add(new JCacheCache(
getCacheManager().createCache("books",
new MutableConfiguration<ISBN,Book>()
.setExpiryPolicyFactory(ModifiedExpiryPolicy.factoryOf(new Duration(TimeUnit.MINUTES, 30)))),
false));
return caches;
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
JCache 中存在您需要的配置选项,这些选项不是标准的一部分。一个例子是限制缓存大小。为此,您始终需要添加供应商特定的配置。如果是支持JCache的cache2k(我是cache2k的作者),配置会被合并,这在cache2k用户指南 - JCache中有详细描述。这意味着在编程级别上,您执行配置的“逻辑”部分,其中“操作”部分(例如缓存大小)可以在外部配置文件中配置。
不幸的是,它不是供应商配置和通过 JCache API 的编程配置如何互操作的标准的一部分。因此,即使是 100% JCache 兼容的缓存也可能会拒绝操作,并要求您仅使用一种配置方式。
归档时间: |
|
查看次数: |
2459 次 |
最近记录: |