EHcache 的使用
一、EHCache API的基本用法
首先介绍CacheManager类。它主要负责读取配置文件,默认读取CLASSPATH下的ehcache.xml,根据配置文件创建并管理Cache对象。
// 使用默认配置文件创建CacheManager
CacheManager manager = CacheManager.create();
// 通过manager可以生成指定名称的Cache对象
Cache cache = cache = manager.getCache("demoCache");
// 使用manager移除指定名称的Cache对象
manager.removeCache("demoCache");
可以通过调用manager.removalAll()来移除所有的Cache。通过调用manager的shutdown()方法可以关闭CacheManager。
有了Cache对象之后就可以进行一些基本的Cache操作,例如:
//往cache中添加元素
Element element = new Element("key", "value");
cache.put(element);
//从cache中取回元素
Element element = cache.get("key");
element.getValue();
//从Cache中移除一个元素
cache.remove("key");
可以直接使用上面的API进行数据对象的缓存,这里需要注意的是对于缓存的对象都是必须可序列化的。
二、DEMO
1、ehcache.xml
<?xml version="1.0" encoding="UTF-8"?><ehcache name="WlanCache"><defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"/> <cache name="alarmParamListCache" maxElementsInMemory="5000" maxElementsOnDisk="1000000" eternal="true" overflowToDisk="false" memoryStoreEvictionPolicy="LRU"> </cache> <cache name="deviceModelCache" maxElementsInMemory="100" maxElementsOnDisk="1000000" eternal="false" overflowToDisk="false" memoryStoreEvictionPolicy="LRU"> </cache> <cache name="alarmSeverityCache" maxElementsInMemory="1000" maxElementsOnDisk="1000000" eternal="false" overflowToDisk="false" memoryStoreEvictionPolicy="LRU"> </cache></ehcache>
2、接口ICache
package com.comba.omc.cache.manager;import java.util.List;/** * cache接口类,只提供put和get两个方法,分别向缓存写和读数据 * * @version * @author 2011-10-18 上午09:44:28 * */public interface ICache {/** * 设置cache名称 * @param cacheName */public void setCacheName(String cacheName);/** * 向缓存put一个键值对数据,注意先调用setCacheName方法设置cache名称 * @param key 键 * @param value 值 * @return 是否put成功 */public boolean put(Object key, Object value);/** * 向缓存put一个键值对数据 * @param cacheName cache名称 * @param key 键 * @param value 值 * @return 是否put成功 */public boolean put(String cacheName, Object key, Object value);/** * 从cache获取数据 * @param <T> 所要获取的值的类型 * @param key 键 * @return 值 */public<T> T get(Object key);/** * 从cache获取数据 * @param <T> 所要获取的值的类型 * @param cacheName cache名称 * @param key 键 * @return 值 */public<T> T get(String cacheName, Object key);/** * 从cache获取并删除数据 * @param <T> 所要获取的值的类型 * @param key 键 * @return 值 */public<T> T pop(Object key);/** * 从cache获取并删除数据 * @param <T> 所要获取的值的类型 * @param cacheName cache名称 * @param key 键 * @return 值 */public<T> T pop(String cacheName, Object key);/** * 从cache删除数据 * @param key 键 * @return 是否成功删除,不存在该key可导致删除失败 */public boolean remove(Object key);/** * 从cache删除数据 * @param cacheName cache名称 * @param key 键 * @return 是否成功删除,不存在该key可导致删除失败 */public boolean remove(String cacheName, Object key);/** * 从cache删除数据 * @return 是否成功删除,不存在该key可导致删除失败 */public boolean removeAll();/** * 从cache删除全部数据 * @param cacheName cache名称 * @return 是否成功删除,不存在该key可导致删除失败 */public boolean removeAll(String cacheName);/** * * 返回缓存大小 * * @author 2011-10-21 * @param cacheName * @return */public long getSize(String cacheName);/** * * 返回缓存大小 * * @author 2011-10-21 * @param cacheName * @return */public long getSize();/** * 返回缓存所有KEY * @return */public List getKeys(String cacheName);/** * 返回缓存所有KEY * @return */public List getKeys();}3、AbstractCache.java
package com.comba.omc.cache.manager;import java.util.List;/** * * @see com.comba.omc.cache.manager.ICache * @version * @author 2011-10-18 上午09:47:36 * */public abstract class AbstractCache implements ICache {private String cacheName = "";public AbstractCache(String cacheName){setCacheName(cacheName);}public String getCacheName() {return cacheName;}@Overridepublic void setCacheName(String cacheName){this.cacheName = cacheName;}@Overridepublic boolean put(Object key, Object value){return put(cacheName, key, value);}@SuppressWarnings("unchecked")@Overridepublic<T> T get(Object key){return (T)get(cacheName, key);}@SuppressWarnings("unchecked")@Overridepublic<T> T pop(Object key){return (T)pop(cacheName, key);}@Overridepublic boolean remove(Object key){return remove(cacheName, key);}@Overridepublic boolean removeAll(){return removeAll(cacheName);}@Overridepublic long getSize(){return getSize(cacheName);}@SuppressWarnings("unchecked")@Overridepublic List getKeys(){return getKeys(cacheName);}}4、LocalCache.java
package com.comba.omc.cache.manager;import java.util.List;import net.sf.ehcache.Cache;import net.sf.ehcache.CacheManager;import net.sf.ehcache.Element;import org.apache.log4j.Logger;/** * 本地使用缓存通用类 * * @version * @author 2011-10-18 上午09:51:54 * */public class LocalCache extends AbstractCache {private static Logger logger = Logger.getLogger(LocalCache.class);public LocalCache(String cacheName){super(cacheName);}@SuppressWarnings("unchecked")@Overridepublic<T> T get(String cacheName, Object key) {try{Cache cache = CacheManager.getInstance().getCache(cacheName);if(cache == null){logger.warn("[cache]Cache name not found:"+cacheName);return null;}Element element = cache.get(key);if(element == null) {if (logger.isDebugEnabled()) {logger.debug("[cache]Cache key not found cacheName:" + cacheName + " key:" + key);}return null;}return (T)element.getObjectValue();}catch(Exception e){logger.error(e.getMessage(), e);return null;}}@Overridepublic boolean put(String cacheName, Object key, Object value) {try{CacheManager cachemgr = CacheManager.getInstance();Cache cache = cachemgr.getCache(cacheName);if(cache == null){logger.warn("[cache]Cache name not found:"+cacheName);return false;}Element element = new Element(key, value);cache.put(element);}catch(Exception e){logger.error(e.getMessage(), e);return false;}return true;}@SuppressWarnings("unchecked")@Overridepublic <T> T pop(String cacheName, Object key) {try{Cache cache = CacheManager.getInstance().getCache(cacheName);if(cache == null){logger.warn("[cache]Cache name not found:"+cacheName);return null;}Element element = cache.get(key);if(element == null) {logger.warn("[cache]Cache key not found cacheName:" + cacheName + " key:" + key);return null;}cache.remove(key);return (T)element.getObjectValue();}catch(Exception e){logger.error(e.getMessage(), e);return null;}}@Overridepublic boolean remove(String cacheName, Object key) {try{Cache cache = CacheManager.getInstance().getCache(cacheName);if(cache == null){logger.warn("[cache]Cache name not found:"+cacheName);return false;}return cache.remove(key);}catch(Exception e){logger.error(e.getMessage(), e);return false;}}@Overridepublic boolean removeAll(String cacheName) {try{Cache cache = CacheManager.getInstance().getCache(cacheName);if(cache == null){logger.warn("[cache]Cache name not found:"+cacheName);return false;}cache.removeAll();return true;}catch(Exception e){logger.error(e.getMessage(), e);return false;}}@Overridepublic long getSize(String cacheName) {try{Cache cache = CacheManager.getInstance().getCache(cacheName);if(cache == null){logger.warn("[cache]Cache name not found:"+cacheName);return 0;}return cache.getSize();}catch(Exception e){logger.error(e.getMessage(), e);}return 0;}@SuppressWarnings("unchecked")public List getKeys(String cacheName) {try{Cache cache = CacheManager.getInstance().getCache(cacheName);if(cache == null){logger.warn("[cache]Cache name not found:"+cacheName);return null;}return cache.getKeys();}catch(Exception e){logger.error(e.getMessage(), e);return null;}}}5、CacheManager.java
package com.comba.omc.cache.manager;import com.comba.common.util.Util;import com.comba.omc.common.configure.CommonProperties;/** * 缓存使用接口 * * @version * @author 2011-10-18 下午03:26:30 * */public class CacheManager {private static CacheManager ins = new CacheManager();private String serverUrl = "";private CacheManager() {String tmp = CommonProperties.getProperty("cache.server.host");if (Util.isEmpty(tmp)) {tmp = "127.0.0.1";}serverUrl = tmp;}public static CacheManager Instance() {return ins;}/** * 获取本地缓存 * * @param cacheName * 缓存名称 * @return 缓存对象 */public ICache getLocalCache(String cacheName) {return new LocalCache(cacheName);}}