2016-07-26 95 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參考文檔的鏈接會更好。 –