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