一.介紹與應用場景
ehcache是一開源緩存工具,其許可證為Apache License, Version 2.0,非常友好的許可。在 sourceforge.net 上可找到它的最新版本。
緩存應用在多個領域并發揮作用,ehcache可應用于資料庫通路緩存,安全認證緩存,web緩存,soap 和 RESTFul 服務緩存,應用程式持久對象緩存以及分布式緩存。
二.架設開發環境
無它,隻需把ehcache的相關jar包放到classpath下,把配置檔案ehcache.xml放在classpath下就可以進行應用開發了。下面是配置檔案中預設配置的xml節點的内容
<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代碼 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代碼 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();
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就可以進行一般的應用了