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元素