天天看點

ehcache緩存的使用

一.介紹與應用場景

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就可以進行一般的應用了