2016-07-26 48 views
0

我有一个类从服务XXX执行一些读取操作。这些读取操作最终将执行数据库读取,并且我想通过缓存类中每个方法的结果为每个方法指定的自定义键优化这些调用。Spring中的自动缓存失效

Class a { 

    public Output1 func1(Arguments1 ...) { 
    ... 
    } 

    public Output2 func2(Arguments2 ...) { 
    ... 
    } 

    public Output3 func3(Arguments3 ...) { 
    ... 
    } 

    public Output4 func4(Arguments4 ...) { 
    ... 
    } 
} 

我想使用Spring caching(@Cacheable annotation)为每种方法的缓存结果。

但是,我想通过某种机制(ttl等)自动发生缓存失效。春季缓存可能吗?我知道我们有一个@CacheEvict注释,但我希望驱逐自动发生。

任何帮助,将不胜感激。

回答

5

按照Spring documentation(第36.8):

我如何设置TTL/TTI /驱逐策略/ XXX功能?

直接通过您的缓存提供商。缓存抽象是...... 好吧,抽象不是缓存实现。使用 的解决方案可能支持其他解决方案不支持的各种数据策略和不同的拓扑结构 (例如,采用JDK ConcurrentHashMap) - 因为没有后援支持,所以在缓存抽象中显示为 无用。这种 功能应该直接通过后盾缓存控制, 配置时,或通过其原生API。@

这意味着春天不直接暴露API来设置生存时间,而是继电器上的缓存提供者实现来设置它。这意味着如果高速缓存提供程序允许动态设置这些属性,则需要将Time设置为通过公开的高速缓存管理器。或者,您也可以使用@Cacheable注释来配置Spring正在使用的缓存区域。

为了找到@Cacheable暴露的缓存区域的名称。您可以使用JMX控制台浏览应用程序中的可用缓存区域。

如果使用EHCache例如,一旦你知道的缓存区域,您可以提供XML配置是这样的:

<cache name="myCache" 
     maxEntriesLocalDisk="10000" eternal="false" timeToIdleSeconds="3600" 
     timeToLiveSeconds="0" memoryStoreEvictionPolicy="LFU"> 
</cache> 

我再次重申所有配置为高速缓存提供特定的春季不公开接口打交道时用它。

备注:如果未定义缓存提供程序,则由Spring配置的默认缓存提供程序为ConcurrentHashMap。它不支持“生存时间”。为了获得这个功能,你必须切换到不同的缓存提供者(例如EHCache)。

+0

你可以指向基本Spring缓存设置ttl的配置吗?我在http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cache.html –

+0

的文档中找不到任何与ttl相关的配置。您好@KumarMrinal我很抱歉让人失望但由Spring配置的默认缓存是不支持Time Live的ConcurrentHashMap。这意味着你必须切换到另一个支持is的提供者。上面已经提到的EHCache对于非分布式缓存提供者来说是一个很好的选择。 –

+1

@AlexanderPetrov很好的答案,通过提供一个指向缓存提供者的链接(比如你在你的答案中提到的EhCache)以及一个你从中获得引用的Spring参考文档的链接会更好。 –