2017-04-14 711 views
0

我想完成的是爲緩存設置TTL(生存時間)和TTI(時間到空閒),以便密鑰在TTL時間,或者在TTI期間未被訪問的情況下可以提前過期。在Ehcache 3 XML配置中設置TTL和TTI

在的Ehcache 2有可能具有以下配置:

<cache name="my.custom.Cache" 
     timeToIdleSeconds="10" 
     timeToLiveSeconds="120"> 
</cache> 

在的Ehcache 3類似的配置塊看起來如下:

<cache alias="my.custom.Cache"> 
    <expiry> 
     <tti unit="seconds">10</tti> 
     <ttl unit="minutes">2</ttl> 
    </expiry> 
</cache> 

的問題是,這樣的結構被認爲是無效因爲ehcache.xsd指出應該只有一個選項根據expiry標記(ttittl,但沒有兩者)。

回答

2

由於在mailing list提及Louis Jacomet

爲了達到你想要什麼,你需要創建一個自定義的Expiry,您可以用在3.3.1推出了Expirations.builder()做,或者用自定義實現的Expiry接口。

但請注意,您對Ehcache 2中到期內容的解釋稍有不正確。當您結合TTL和TTI時,無論是否訪問整個TTL,該元素都將保持有效。但是,如果訪問時間接近TTL週期的末尾,則上次訪問時間+ TTI可以使其在緩存中停留更長時間。如果在此期間再次訪問,則上次訪問時間會再次更新,從而延長映射的使用期限。

在Ehcache 3中工作的方式Expiry略有不同,因爲我們有效地計算每次映射創建,訪問或更新時的到期時間。這樣做是爲了減少存儲映射的開銷。

因此,如果您配置ExpirygetExpiryForCreation返回120秒但getExpiryForAccess回10秒,一個創建但從未訪問元素將被視爲120秒後的到期。雖然創建但訪問的元素在上次訪問後10秒會被視爲過期,即使該時間仍在120秒內。 當你考慮這個問題時,TTI確實是一個奇怪的概念,我們保留了JCache的兼容性,但它實際上更接近驅逐而不是過期。因爲它正在閱讀的價值的新鮮度意味着什麼?雖然這確實意味着這是緩存中不應該被驅逐的有用值。

而在XML中,不能組合使用tti和ttl快捷方式。但是您可以通過完全限定的類名來配置到期日。我們應該考慮擴展XML系統,以便可以在代碼中執行一些等同的添加構建器。