1. 程式人生 > >Java 快取之 Ehcache 詳解

Java 快取之 Ehcache 詳解



一:EhCache是一個純Java的程序內快取框架,具有如下特點:
    1. 快速簡單,非常容易和應用整合。
    2.支援多種快取策略 。
    3. 快取資料有兩級:記憶體和磁碟,因此無需擔心容量問題 。
    4. 快取資料會在虛擬機器重啟的過程中寫入磁碟 。
    5. 可以通過RMI、可插入API等方式進行分散式快取。
    6. 具有快取和快取管理器的偵聽介面 。
    7. 支援多快取管理器例項,以及一個例項的多個快取區域 等特點。

二:cache.xml檔案簡介


xml檔案配置:     
      <ehcache>
   <!-- 指定一個檔案目錄,當EHCache把資料寫到硬碟上時,將把資料寫到這個檔案目錄下 -->           
   <diskStore path="java.io.tmpdir"/>           
   <!-- 設定快取的預設資料過期策略 -->           
   <defaultCache  maxElementsInMemory="10000"  eternal="false"  overflowToDisk="true" timeToIdleSeconds="0"
   timeToLiveSeconds="0" diskPersistent="false" diskExpiryThreadIntervalSeconds="120"/>        
   <!--自己快取設定-->
   <cache name="TESTCACHE" maxElementsInMemory="1000" eternal="true" overflowToDisk="true"/>       
   </ehcache>

      ehcache.xml元素的屬性:
     name:快取名稱

        maxElementsInMemory:記憶體中最大快取物件數

       maxElementsOnDisk:硬碟中最大快取物件數,若是0表示無窮大

       eternal:true表示物件永不過期,此時會忽略timeToIdleSeconds和timeToLiveSeconds屬性,預設為false

       overflowToDisk:true表示當記憶體快取的物件數目達到了maxElementsInMemory界限後,會把溢位的物件寫到硬碟快取中。注意:如果快取的物件要寫入到硬碟中的話,則該物件必須實現了Serializable接口才行。

       diskSpoolBufferSizeMB:磁碟快取區大小,預設為30MB。每個Cache都應該有自己的一個快取區。

       diskPersistent:是否快取虛擬機器重啟期資料

       diskExpiryThreadIntervalSeconds:磁碟失效執行緒執行時間間隔,預設是120秒.

       timeToIdleSeconds: 設定允許物件處於空閒狀態的最長時間,以秒為單位。當物件自從最近一次被訪問後,如果處於空閒狀態的時間超過了timeToIdleSeconds屬性值,這個物件就會過期,EHCache將把它從快取中清空。只有當eternal屬性為false,該屬性才

                                 有效。如果該屬性值為0,則表示物件可以無限期地處於空閒狀態

       timeToLiveSeconds:設定物件允許存在於快取中的最長時間,以秒為單位。當物件自從被存放到快取中後,如果處於快取中的時間超過了 timeToLiveSeconds屬性值,這個物件就會過期,EHCache將把它從快取中清除。只有當eternal屬性為false,該屬性才有

                                 效。如果該屬性值為0,則表示物件可以無限期地存在於快取中。timeToLiveSeconds必須大於timeToIdleSeconds屬性,才有意義.

       memoryStoreEvictionPolicy:當達到maxElementsInMemory限制時,Ehcache將會根據指定的策略去清理記憶體。可選策略有:LRU(最近最少使用,預設策略)、FIFO(先進先出)、LFU(最少訪問次數)。

三:Cache的資料淘汰策略


FIFO :first in first out ,這個是大家最熟的,先進先出。
LFU : Less Frequently Used ,一直以來最少被使用的將被清除,快取的元素有一個hit 屬性,hit 值最小的將會被清出快取。
LRU (預設):Least Recently Used ,最近最少使用的,快取的元素有一個時間戳,當快取容量滿了,
 而又需要騰出地方來快取新的元素的時候,那麼現有快取元素中時間戳離當前時間最遠的元素將被清出快取.

四:快取資料儲存位置:

 記憶體和磁碟;快取資料會在虛擬機器重啟的過程中寫入磁碟

根據需要將快取刷到磁碟。將快取條目刷到磁碟的操作可以通過cache.flush()方法來執行.;

在建立cache的時候,指定了儲存在硬碟上也是ok 的,不過沒有這個直觀。

五:建立Cache的方式以及使用:

A:使用預設配置檔案建立:


java程式碼:
CacheManager manager = CacheManager.create(); 

B:使用指定配置檔案建立:


java程式碼:
CacheManager manager = CacheManager.create("src/config/ehcache.xml"); 

C:從classpath中找尋配置檔案並建立:


java程式碼:
URL url = getClass().getResource("/anothername.xml"); 
CacheManager manager = CacheManager.create(url); 

D:通過輸入流建立:


java程式碼:
InputStream fis = new FileInputStream(new File("src/config/ehcache.xml").getAbsolutePath()); 
try { 
manager = CacheManager.create(fis); 
} finally { 
fis.close(); 

E:解除安裝CacheManager ,關閉Cache :


java程式碼:
manager.shutdown(); 

F:使用Caches :


取得配置檔案中預先 定義的sampleCache1設定,通過CacheManager生成一個Cache
java程式碼:
Cache cache = manager.getCache("demoCache");

G:設定一個名為test 的新cache,test屬性為預設:


java程式碼:
CacheManager manager = CacheManager.create(); 
manager.addCache("test"); 

H:設定一個名為test 的新cache,並定義其屬性:


java程式碼:
//CacheManager manager = CacheManager.create(); 
Cache cache = new Cache("test", 1, true, false, 5, 2); 
manager.addCache(cache); 

I:往cache中加入元素:


java程式碼:
Element element = new Element("key1", "value1");   

J:從cache中取得元素:


java程式碼:
Element element = cache.get("key1");  

第一步:生成CacheManager物件
第二步:生成Cache物件
第三步:向Cache物件裡新增由key,value組成的鍵值對的Element元素