2017-09-07 29 views
0

我現在的配置是下面,我打算只緩存多達30種元素和收回最早的之一,當數超過30:有沒有辦法配置ehcache只按時間順序緩存一些數量的元素?

<ehcache> 
    <diskStore path="/path/to/store/"></diskStore> 
    <cache name="myCache" 
     eternal="false" 
     maxEntriesLocalHeap="30" 
     maxEntriesLocalDisk="30" 
     memoryStoreEvictionPolicy="FIFO"> 
     <persistence strategy="localTempSwap"/> 
    </cache> 
</ehcache> 

我有它運行的每一分鐘另一個計劃的作業放新元素放入緩存中。所以我預計最近30分鐘內只能獲得30個元素。 但是到期/驅逐並不如預期。一些非常古老的元素仍然保留着,而最近30分鐘內的一些元素卻被意外驅逐。我在這裏錯過了什麼嗎?

我已閱讀ehcache中的過期/驅逐相關文檔,但未找到任何線索。希望有人能幫助:)

BTW,該版本的Ehcache 2.6.6是

回答

0

感謝@Louis的回答和建議。

在ehcache文檔中,我瞭解到memoryStoreEvictionPolicy is only for memory store,而在我的案例中使用了磁盤存儲。並且磁盤存儲的驅逐策略默認爲LFU,並且不可配置

在了Ehcache,該MemoryStore的可能限制大小(請參閱如何尺寸 緩存獲取更多信息)。當商店滿員時,元素被驅逐出 。 Ehcache中的驅逐算法確定哪些元素被驅逐。默認是LRU。

... DiskStore逐出算法不可配置。它使用LFU。

因此,要達到什麼我期待,我改變了只使用內存存儲,因爲磁盤存儲上當前持續的策略是不重新啓動(localTempswap),這是在使用內存存儲等同。最終配置如下:

<cache name="myCache" 
     eternal="false" 
     maxEntriesLocalHeap="30" 
     memoryStoreEvictionPolicy="FIFO"> 
</cache> 
+1

注意:您可以使用磁盤存儲中的數據重新啓動,您必須確保正確調用'CacheManager.shutdown()'方法。因此_restartable_,而不是_crash proof_。 –

+0

@LouisJacomet是嗎?甚至使用'localTempswap'持久策略?我在ehcache doc中學到的是,只有'localRestartable'策略是可重新啓動的,並且僅適用於企業版。 –

+0

@LouisJacomet我再次走過ehcache文檔,並且能夠確認持久性策略localTempSwap不是持久性的,因此無法重新啓動。 –

1

的Ehcache驅逐策略一直有他們啓發式的某一水平。例如,驅逐策略不適用於整個緩存羣體,這對於大型緩存來說代價太高,而是在樣本上。

這就是爲什麼與您的要求相比,您正在經歷不準確的結果。

現在考慮到您想保留的元素數量有限,LinkedHashMap聽起來像是一個不錯的選擇,但它對於多線程訪問並不安全。

相關問題