Spring中的自动缓存失效

时间:2016-07-26 18:51:18

标签: java spring spring-mvc caching invalidation

我有一个类从服务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注释,但我希望这种驱逐能够自动发生。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:6)

根据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)。