EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider,和Spring也能很好的整合到一起
主要的特性有(来源于百度百科):
- 快速
- 简单
- 多种缓存策略
- 缓存数据有两级:内存和磁盘,因此无需担心容量问题
- 缓存数据会在虚拟机重启的过程中写入磁盘
- 可以通过RMI、可插入API等方式进行分布式缓存
- 具有缓存和缓存管理器的侦听接口
- 支持多缓存管理器实例,以及一个实例的多个缓存区域
- 提供Hibernate的缓存实现
这里面有两个最主要,一个是在内存满后可以缓存至磁盘,另一个是多缓存区域。
下面讲一下具体使用
添加依赖
net.sf.ehcache
ehcache
2.10.2
ehcache.xml配置文件
这里是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 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)