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)
网友评论