缓存实现为此任务提供了一个名为写入后过期或生命周期的功能。不同的缓存实现有很多差异。在 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);
}
}
更多信息请参见cache2k User Guide - Spring Framework Support。其他缓存实现,如 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;
}
};
}
}
在 JCache 中,有一些您需要的配置选项,它们不是标准的一部分。一个例子是限制缓存大小。为此,您始终需要添加特定于供应商的配置。对于支持JCache的cache2k(我是cache2k的作者),配置合并,在cache2k User Guide - JCache有详细描述。这意味着在编程级别上,您执行配置的“逻辑”部分,而像缓存大小这样的“操作”部分可以在外部配置文件中进行配置。
不幸的是,供应商配置和通过 JCache API 进行的编程配置需要如何互操作并不是标准的一部分。因此,即使是 100% 与 JCache 兼容的缓存也可能会拒绝操作,并要求您仅使用一种配置方式。