一.介紹與應用場景
ehcache是一開源緩存工具,其許可證為Apache License, Version 2.0,非常友好的許可。在 sourceforge.net 上可找到它的最新版本。
緩存應用在多個領域并發揮作用,ehcache可應用于資料庫通路緩存,安全認證緩存,web緩存,soap 和 RESTFul 服務緩存,應用程式持久對象緩存以及分布式緩存。
二.架設開發環境
無它,隻需把ehcache的相關jar包放到classpath下,把配置檔案ehcache.xml放在classpath下就可以進行應用開發了。下面是配置檔案中預設配置的xml節點的内容
[xhtml] view plaincopy
- <defaultCache
- maxElementsInMemory="10000"
- eternal="false"
- timeToIdleSeconds="120"
- timeToLiveSeconds="120"
- overflowToDisk="true"
- diskSpoolBufferSizeMB="30"
- maxElementsOnDisk="10000000"
- diskPersistent="false"
- diskExpiryThreadIntervalSeconds="120"
- memoryStoreEvictionPolicy="LRU"
- />
- <defaultCache
- maxElementsInMemory="10000"
- eternal="false"
- timeToIdleSeconds="120"
- timeToLiveSeconds="120"
- overflowToDisk="true"
- diskSpoolBufferSizeMB="30"
- maxElementsOnDisk="10000000"
- diskPersistent="false"
- diskExpiryThreadIntervalSeconds="120"
- memoryStoreEvictionPolicy="LRU"
- />
原檔案中有比較詳盡的注釋,在這裡我簡單翻譯幾個
1.必須要有的屬性:
name: cache的名字,用來識别不同的cache,必須惟一。
maxElementsInMemory: 記憶體管理的緩存元素數量最大限值。
maxElementsOnDisk: 硬碟管理的緩存元素數量最大限值。預設值為0,就是沒有限制。
eternal: 設定元素是否持久話。若設為true,則緩存元素不會過期。
overflowToDisk: 設定是否在記憶體填滿的時候把資料轉到磁盤上。
2.下面是一些可選屬性:
timeToIdleSeconds: 設定元素在過期前空閑狀态的時間,隻對非持久性緩存對象有效。預設值為0,值為0意味着元素可以閑置至無限長時間。
timeToLiveSeconds: 設定元素從建立到過期的時間。其他與timeToIdleSeconds類似。
diskPersistent: 設定在虛拟機重新開機時是否進行磁盤存儲,預設為false.(我的直覺,對于安全小型應用,宜設為true)。
diskExpiryThreadIntervalSeconds: 通路磁盤線程活動時間。
diskSpoolBufferSizeMB: 存入磁盤時的緩沖區大小,預設30MB,每個緩存都有自己的緩沖區。
memoryStoreEvictionPolicy: 元素逐出緩存規則。共有三種,Recently Used (LRU)最近最少使用,為預設。 First In First Out (FIFO),先進先出。Less Frequently Used(specified as LFU)最少使用。
三.執行個體編寫
繼續以往的作風,用代碼說話。代碼中有良好的注釋。(代碼參考字官方文檔)
1. 使用 CacheManager
Java代碼
[java] view plaincopy
- package tutorial;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.InputStream;
- import java.net.URL;
- import net.sf.ehcache.Cache;
- import net.sf.ehcache.CacheManager;
- /**
- * 使用 CacheManager
- * @author zhangyt
- *
- */
- public class UsingTheCacheManager {
- public static void main(String[] args) throws Exception {
- //1.
- //建立CacheManager單例對象,使用預設配置
- CacheManager.create();
- String[] cacheNames1 = CacheManager.getInstance().getCacheNames();
- //關閉
- CacheManager.getInstance().shutdown();
- //2.
- //用預設配置建立對象可用此建立多例
- CacheManager manager2 = new CacheManager();
- String[] cacheNames2 = manager2.getCacheNames();
- manager2.shutdown();
- //3.加載配置的方式
- //3.1 用預設配置加載在上面已經提到。即需要在classpath下放置ehcache.xml配置檔案
- //3.2 用指定配置檔案路徑的方式建立
- CacheManager manager31 = new CacheManager("src/config/ehcache.xml");
- manager31.shutdown();
- //3.2 用classpath下的配置檔案生成
- URL url = UsingTheCacheManager.class.getClassLoader().getResource("config/ehcache.xml");
- CacheManager manager32 = new CacheManager(url);
- manager32.shutdown();
- //3.3 通過輸入流生成
- InputStream fis = new FileInputStream(new File("src/config/ehcache.xml").getAbsolutePath());
- try {
- CacheManager manager33 = new CacheManager(fis);
- manager33.shutdown();
- } finally {
- fis.close();
- }
- //4. 以程式設計的方式添加和删除cache
- CacheManager singletonManager4 = CacheManager.create();
- //4.1 用預設配置添加
- singletonManager4.addCache("test41");
- Cache test41 = singletonManager4.getCache("test41");
- System.out.println(test41 != null);
- //4.2 建立一個cache并添加到CacheManager
- Cache memoryOnlyCache = new Cache("test42", 5000, false, false, 5, 2);
- singletonManager4.addCache(memoryOnlyCache);
- Cache test42 = singletonManager4.getCache("test42");
- //4.3 删除cache
- singletonManager4.removeCache("sampleCache1");
- singletonManager4.shutdown();
- }
- }
2. 使用 Caches
Java代碼
- import java.io.Serializable;
- import java.lang.management.ManagementFactory;
- import javax.management.MBeanServer;
- import net.sf.ehcache.Element;
- import net.sf.ehcache.management.ManagementService;
- * 使用 Caches
- public class UsingCaches {
- public static void main(String[] args) {
- CacheManager manager= CacheManager.getInstance();
- manager.addCache("sampleCache1");
- //1.取得Cache
- Cache cache = manager.getCache("sampleCache1");
- //2.執行 CRUD 操作
- //2.1 增加元素
- Element element1 = new Element("key1", "value1");
- Element element2 = new Element("key2", "value2");
- cache.put(element1);
- cache.put(element2);
- //2.2 更新元素
- cache.put(new Element("key1", "value1u"));
- //2.3 取值
- //取得一個序列化了的值
- Element element231 = cache.get("key1");
- Serializable value231 = element231.getValue();
- System.out.println(value231);
- //取得一個不是序列化的值
- Element element232 = cache.get("key1");
- Object value232 = element232.getObjectValue();
- System.out.println(value232);
- //3.4 删除一個元素
- cache.remove("key2");
- System.out.println(cache.get("key2") == null);
- //3. 強硬指令寫入硬碟
- cache.flush();
- //4. 取得緩存的大小
- //得到總的緩存數目
- int elements = cache.getSize();
- System.out.println(elements);
- //得到在記憶體中的元素數量
- long elementsInMemory = cache.getMemoryStoreSize();
- System.out.println(elementsInMemory);
- //得到硬碟中的緩存元素數量
- long elementsInDisk = cache.getDiskStoreSize();
- System.out.println(elementsInDisk);
- /**
- * 在官方文檔中有cache.getHitCount();等相關方法,在這裡已經找不到
- * 應該是版本變遷的原因。
- */
- //5.進階主題 注冊mbean 也許在以後的進階主題中會進一步闡述
- CacheManager manager1 = new CacheManager();
- MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
- ManagementService.registerMBeans(manager1, mBeanServer, false, false, false, true);
- manager.shutdown();
- }
- package tutorial;
- import java.io.Serializable;
- import java.lang.management.ManagementFactory;
- import javax.management.MBeanServer;
- import net.sf.ehcache.Cache;
- import net.sf.ehcache.CacheManager;
- import net.sf.ehcache.Element;
- import net.sf.ehcache.management.ManagementService;
- /**
- * 使用 Caches
- * @author zhangyt
- *
- */
- public class UsingCaches {
- public static void main(String[] args) {
- CacheManager.create();
- CacheManager manager= CacheManager.getInstance();
- //1.取得Cache
- Cache cache = manager.getCache("sampleCache1");
- //2.執行 CRUD 操作
- //2.1 增加元素
- Element element1 = new Element("key1", "value1");
- Element element2 = new Element("key2", "value2");
- cache.put(element1);
- cache.put(element2);
- //2.2 更新元素
- cache.put(new Element("key1", "value1u"));
- //2.3 取值
- //取得一個序列化了的值
- Element element231 = cache.get("key1");
- Serializable value231 = element231.getValue();
- System.out.println(value231);
- //取得一個不是序列化的值
- Element element232 = cache.get("key1");
- Object value232 = element232.getObjectValue();
- System.out.println(value232);
- //3.4 删除一個元素
- cache.remove("key2");
- System.out.println(cache.get("key2") == null);
- //3. 強硬指令寫入硬碟
- cache.flush();
- //4. 取得緩存的大小
- //得到總的緩存數目
- int elements = cache.getSize();
- System.out.println(elements);
- //得到在記憶體中的元素數量
- long elementsInMemory = cache.getMemoryStoreSize();
- System.out.println(elementsInMemory);
- //得到硬碟中的緩存元素數量
- long elementsInDisk = cache.getDiskStoreSize();
- System.out.println(elementsInDisk);
- /**
- * 在官方文檔中有cache.getHitCount();等相關方法,在這裡已經找不到
- * 應該是版本變遷的原因。
- */
- //5.進階主題 注冊mbean 也許在以後的進階主題中會進一步闡述
- CacheManager manager1 = new CacheManager();
- MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
- ManagementService.registerMBeans(manager1, mBeanServer, false, false, false, true);
- manager.shutdown();
- }
- }
看了以上的内容,相信對ehcache就可以進行一般的應用了