EhCache 是一個純Java的進程內緩存框架,具有快速、精干等特點,是Hibernate中默認的CacheProvider,和Spring也能很好的整合到一起
主要的特性有(來源于百度百科):
- 快速
- 簡單
- 多種緩存策略
- 緩存數據有兩級:內存和磁盤,因此無需擔心容量問題
- 緩存數據會在虛擬機重啟的過程中寫入磁盤
- 可以通過RMI、可插入API等方式進行分布式緩存
- 具有緩存和緩存管理器的偵聽接口
- 支持多緩存管理器實例,以及一個實例的多個緩存區域
- 提供Hibernate的緩存實現
這里面有兩個最主要,一個是在內存滿后可以緩存至磁盤,另一個是多緩存區域。
下面講一下具體使用
添加依賴
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.10.2</version>
</dependency>
ehcache.xml配置文件
<?xml version="1.0" encoding="gbk"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">
<diskStore path="java.io.tmpdir"/>
<defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="30" timeToLiveSeconds="30" overflowToDisk="false"/>
<!--
配置自定義緩存
maxElementsInMemory:緩存中允許創建的最大對象數
eternal:緩存中對象是否為永久的,如果是,超時設置將被忽略,對象從不過期。
timeToIdleSeconds:緩存數據的鈍化時間,也就是在一個元素消亡之前,
兩次訪問時間的最大時間間隔值,這只能在元素不是永久駐留時有效,
如果該值是 0 就意味著元素可以停頓無窮長的時間。
timeToLiveSeconds:緩存數據的生存時間,也就是一個元素從構建到消亡的最大時間間隔值,
這只能在元素不是永久駐留時有效,如果該值是0就意味著元素可以停頓無窮長的時間。
overflowToDisk:內存不足時,是否啟用磁盤緩存。
memoryStoreEvictionPolicy:緩存滿了之后的淘汰算法。
-->
<cache name="sysCache"
maxElementsInMemory="10"
eternal="false"
overflowToDisk="false"
timeToIdleSeconds="900"
timeToLiveSeconds="1800"
memoryStoreEvictionPolicy="LFU" />
</ehcache>
這里是EhCache的配置文件,里面的注釋寫的非常清楚,最常用的幾個屬性也都寫清楚含義了。
EhCacheUtil工具類
private static volatile EhCacheUtil ehCacheUtil;
private static volatile CacheManager cacheManager;
private static Logger log = LoggerFactory.getLogger(EhCacheUtil.class);
private static String confPath = "/ehcache.xml";//定義配置文件路徑
public static EhCacheUtil getInstance() {
if (null == ehCacheUtil) {
synchronized (EhCacheUtil.class) {
if (null == ehCacheUtil) {
ehCacheUtil = new EhCacheUtil();
}
}
}
return ehCacheUtil;
}
static {
try {
URL url = EhCacheUtil.class.getResource(confPath);
cacheManager = CacheManager.create(url);
log.info("ehcache初始化");
} catch (Exception e) {
e.printStackTrace();
log.info("ehcache初始化失敗");
}
}
上面是利用單例模式初始化CacheManager
static Cache getOrAddCache(String cacheName) {
Cache cache = cacheManager.getCache(cacheName);
if (cache == null) {
synchronized (cacheManager) {
cache = cacheManager.getCache(cacheName);
if (cache == null) {
log.warn("Could not find cache config [" + cacheName + "], using default.");
cacheManager.addCacheIfAbsent(cacheName);
cache = cacheManager.getCache(cacheName);
log.info("Cache [" + cacheName + "] started.");
}
}
}
return cache;
}
根據cache的區域獲取對應的cache
public static void put(String cacheName, Object key, Object value) {
getOrAddCache(cacheName).put(new Element(key, value));
}
@SuppressWarnings("unchecked")
public static <T> T get(String cacheName, Object key) {
Element element = getOrAddCache(cacheName).get(key);
return element != null ? (T) element.getObjectValue() : null;
}
@SuppressWarnings("rawtypes")
public static List getKeys(String cacheName) {
return getOrAddCache(cacheName).getKeys();
}
public static void remove(String cacheName, Object key) {
getOrAddCache(cacheName).remove(key);
}
public static void removeAll(String cacheName) {
getOrAddCache(cacheName).removeAll();
}
這幾個方法就是把對象放入緩存,根據key來獲取緩存,按照區域清空緩存。
cache的使用
public static void main(String[] args) {
EhCacheUtil.put("sysCache", "cache", "Hello EhCache");
String value = EhCacheUtil.get("sysCache", "cache");
System.out.println(value);
}
初始化一個sysCache
的區域,key是cache
,value是Hello EhCache
上面那個EhCacheUtil工具類可以直接用于實際開發,在實際開發中要配置自定義的緩存區域,這樣就可以直接清理這個區域,而不用一個一個key的去刪除。
源碼下載
[本工程詳細源碼]
(https://github.com/chykong/java_component/tree/master/chapter2_1_EhCache)