我有一个类从服务XXX执行一些读取操作。这些读取操作最终将执行数据库读取,我想通过缓存每个方法的指定自定义键的类中每个方法的结果来优化这些调用。
Class a {
public Output1 func1(Arguments1 ...) {
...
}
public Output2 func2(Arguments2 ...) {
...
}
public Output3 func3(Arguments3 ...) {
...
}
public Output4 func4(Arguments4 ...) {
...
}
}
我正在考虑使用Spring caching(@Cacheable annotation)
来缓存每种方法的结果。
但是,我想通过某种机制(ttl等)自动发生缓存失效。这可能在Spring缓存中吗?我知道我们有一个@CacheEvict
注释,但我希望自动发生这种驱逐。
任何帮助,将不胜感激。
根据Spring documentation(第36.8节):
如何设置TTL / TTI /逐出政策/ XXX功能?
直接通过缓存提供程序。缓存抽象是......好吧,抽象不是缓存实现。您正在使用的解决方案可能支持各种数据策略和其他解决方案所不具备的不同拓扑(例如JDK ConcurrentHashMap) - 暴露在缓存抽象中仅仅因为没有后备支持而无用。在配置或通过其本机API时,应通过后备缓存直接控制此类功能。@
这意味着Spring不会直接公开API来设置生存时间,而是在缓存提供程序实现上继续设置它。这意味着,如果缓存提供程序允许动态设置这些属性,则需要将时间设置为通过公开的缓存管理器生存。或者您应该使用@Cacheable
注释自己配置Spring正在使用的缓存区域。
为了找到@Cacheable
正在暴露的缓存区域的名称。您可以使用JMX控制台浏览应用程序中的可用缓存区域。
例如,如果您使用EHCache知道缓存区域,则可以提供如下的xml配置:
<cache name="myCache"
maxEntriesLocalDisk="10000" eternal="false" timeToIdleSeconds="3600"
timeToLiveSeconds="0" memoryStoreEvictionPolicy="LFU">
</cache>
我再次重复所有配置都是特定于缓存提供程序,并且Spring在处理它时不会公开接口。
备注:如果没有定义缓存提供程序,则由Spring配置的默认缓存提供程序是ConcurrentHashMap
。它不支持生存时间。要获得此功能,您必须切换到其他缓存提供程序(例如EHCache)。