Ehcache緩存回收策略


Ehcache緩存

簡介

Ehcache是一個用JAVA實現的,使用簡單,高速,實現線程安全的緩存管理類庫,Ehcache提供了用內存,磁盤文件存儲,以及分布式存儲方式等多種靈活的Cache管理方案。采用限制比較寬松的Apache License v2.0作為授權方式,被廣泛地用於Hibernate,Spring,Cocoon等其他開源框架。

緩存回收就是當緩存滿了的時候,Ehcache會根據指定的策略來清理緩存。這里的緩存回收策略有別與Ehcache中的失效清理策略。失效清理策略是對失效的Element進行批量清理時所采用的策略,最終所有失效的Element都將被清理,只不過是清理的先后順序不同罷了。Ehcache中緩存的最大Element數是由maxElementsInMemory來指定的。當緩存中的Element個數達到maxElementsInMemory指定的值時,Ehcache會根據具體的策略來清理緩存,默認的策略是LRU(最近最少使用)。

磁盤緩存大小默認是沒有限制的,不過可通過maxElementsOnDisk來指定。當磁盤緩存達到maxElementsOnDisk指定的值時,Ehcache會清理磁盤中的緩存使用默認策略是LFU(使用頻率最低)。

 Ehcache的類層次模型

 Ehcache的類層次模型主要為三層,最上層的是CacheManager,它是操作Ehcache的入口。我們可以通過CacheManager.getInstance()獲得一個單個的CacheManager,或者通過CacheManager的構造函數創建一個新的CacheManager.每個CacheManager都管理着多個Cache。而每個Cache都以一種類Hash的方式,關聯着多個Element。而Element則是我們用於存放要緩存內容的地方。

Ehcache的刷新策略

ehcache的刷新策略是當緩存在放入的時候記錄一個放入時間,它是用Lazy Evict的方式,在取的時候同設置的TTL比較 。

MemoryStore回收策略

MemoryStore支持三種策略:LRU、LFU、FIFO。

1.LRU:最近最少使用的,緩存的元素有一個時間戳,當緩存容量滿了,而又需要騰出地方來緩存新的元素的時候,那么現有緩存元素中時間戳離當前時間最遠的元素將被清除緩存。

2.LFU:最少被使用,緩存的元素有一個hit屬性,hit值最小的將會被清除緩存。

3.FIFO:先進先出。 

 事件處理

可以為CacheManager添加事件監聽,當對CacheManager增刪Cache時,事件處理器將會得到通知。要配置事件處理,需要通過ehcache的配置文件來完成。可以為Cache添加事件監聽,當對Cache增刪Element時,事件處理器將會得到通知。要配置事件處理,需要通過ehcache的配置文件來完成。

ehcache參數配置

eternal - 設置元素(內存中對象)是否永久駐留。如果是,將忽略超時限制且元素永不消亡。

timeToIdleSeconds - 設置某個元素消亡前的停頓時間。也就是在一個元素消亡之前,兩次訪問時間的最大時間間隔值。這只能在元素不是永久駐留時有效(譯注:如果對象永恆不滅,則設置該屬性也無用 )。 如果該值是0就是意味着元素不是永久駐留時有效。

 timeToLiveSeconds - 為元素設置消亡前的生存時間。也就是一個元素從構建到消亡的最大時間間隔值。這只能在元素不是永久駐留時有效。

overflowToDisk  - 設置當內存中緩存達到maxInMemory 限制時元素是否可寫到磁盤上。

1. ehcache使用了LinkedHashMap來存放Element。jdk要1.5以上。Ehcache1.5可以使用jdk1.4

2.如果在添加Elemtent時,緩存中的Element個數達到了最大緩存數並且overflowToDisk配置的屬性為true,Ehcache會更具配置項MemoryStoreEvictionPolicy的失效策略將Element輸出到磁盤。如果overflowToDisk為fasle,Ehcache將刪除內存中Element

3.值得注意的是緩存中失效的Element並不會別馬上清理掉,所以想得到內存的真實大小應該調用方法calculateInMemorySize()方法。

4.一個ehcache.xml對應一個CacheManage。

5.不同的緩存應該對應不同的硬盤上的路徑,否則會報錯。

6.注意要想使用磁盤緩存,緩存的Element必須實現序列化接口。否則會拋出NotSerializableException異常。

7.Ehcache會將每個緩存配置的文件路徑下創建一個cache_name.data文件,如果使用的磁盤持久化技術,還會生成一個cache name.index文件。

8.Ehcache有一個后台線程專門做Ellment失效監測以及清除工作。設置線程運行間隔時間,可通過設置diskExpiryThreadIntervalSeconds屬性來完成,此值不宜設置過低,否則會導致清理線程占用大量CPU資源。默認值是120秒。

9.持久化可在Element的diskPersistent配置項中配置,如果配置為“false”或是“omitted”在CacheManager shutdown或是startup后,用來緩存Element的文件將被清除掉。如果設置為“true”,data和index文件會被保存下來,對於新創建的CacheManager Element也是可用的。

10.使用時必須顯示調用cache. Flush()才會將數據緩存到磁盤中。

11.磁盤緩存步驟:從MemoryStore中把沒有失效的Element刷新到DiskStore,Element被寫入到data文件,Element將被序列化到index文件。

12.磁盤緩存大小默認是沒有限制的,不過可通過maxElementsOnDisk來指定。當磁盤緩存達到maxElementsOnDisk指定的值時,Ehcache會清理磁盤中的緩存使用默認策略是LFU(使用頻率最低)。

13.在使用完Ehcache后,必須要shutdown緩存。Ehcache中有自己的關閉機制,不過最好在你的代碼中顯示調用CacheManager.getInstance().shutdown();

14.Cache:對於getValue()能取到可序列化的值;getObjectValue()取得非序列化的值。

15.cache.getSize();得到緩存中元素的個數;獲得當前MemoryStore中的element數量:cache.getMemoryStoreSize();獲得當前DiskStore中element數量:cache.getDiskStoreSize()。

16.在使用完Ehcache后,必須要shutdown緩存。Ehcache中有自己的關閉機制,不過最好在你的代碼中顯示調用CacheManager.getInstance().shutdown();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM