一. EHCache.xml 配置文件解析:
二. EHCache使用
三. 待研究部分
EHCache是一个非常轻量级的缓冲,是Hibernate的默认缓存。同时ehcache应该说是java范围内使用最广泛的缓存。同时它也支持分布式缓存。也提供了磁盘,内存的缓存存储。
一. EHCache.xml 配置文件解析:
<diskStore>元素:制定一个路径,当EHCache把数据写到硬盘上的时候,会把数据写到该目录下。user.home - 用户主目录;user.dir - 用户当
前工作目录;java.io.tmpdir - 默认临时文件路径。
<defaultCache>元素:设定缓存的默认数据过期策略。
<cache>元素:设定具体的命名缓存的数据过期策略。
name - 缓冲名称。通常为缓存对象的类名;
maxElementsInMemory:设置基于内存的
缓存可存放对象的最大数目;
maxElementOnDisk:设置基于硬盘的缓存可存放对象的最大数目;
eternal:如果为true,表示对象永远不会过
期,此时会忽略tiemToldleSeconds和timeToLiveSeconds属性,默认为false。
timeToldleSeconds:设置允许对象处于空间状态的最长时间,
以秒为单位。当对象自动最近一次被访问后,如果处于空闲状态的时间超过了
timeToldleSeconds属性值,这个对象就会过期。当对象过期,
EHCache将把它从缓存中清空。只有当eternal属性为false,该属性才有
效。如果该属性的值为0,那么就表示该对象可以无限期地存于缓存中。
timeToLiveSeconds:必须大于timeToldleSeconds属性,才有意义;
overflowToDisk:如果为true,表示当基于内存的缓存中的对象数目达到了
maxElementsInMemory界限后,会把溢出的对象写到基于硬盘的缓存中。注意,如果缓存的对象要写入到硬盘中的话,则该对象必
须
时间了
Serializable接口才行(也就是序列化);
memoryStoreEvictionPolicy:缓存对象清除策略。有三种:
1. FIFO,first in first out,先进先出。
2. LFU,Less
Frequently Used,一直以来最少被使用策略,缓存元素有一个hit属性,hit值最小的将会被清除出缓存。
3. LRU:least Recenly used,最近最少被
使用,缓存的元素有
一个时间戳,当缓存的容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的
元素将被清出缓存。
二.EHCache使用
2.1 单独使用EHCache
首先创建CacheManager:
1. 如果使用默认配置文件,则:
CacheManager manager = CacheManager.create();
2. 如果使用自己的文件,则
CacheManager manager = CacheManager.create("xxx/xxx/ehcache.xml");
3. 可以从classpath中查找配置文件并且创建:
URL url = getClass().getResource("/ehcache.xml");CacheManager manager =
CacheManager.create(url);
4.也可以通过流来创建:InputStream fis = new FileInputStream(new File("/src/config/ehcache.xml")).getAbsolutePath());
try{
manager = CacheManager.create(fis);
} finally {
fis.close();
}
然后则需要创建Cache。
1. 取得配置文件中预先定义的xxx(也就是xml文件定义的cache的名字)设置,生成一个Cache。
Cache cache = manager.getCache("xxx");
2. 也可以自己在代码中定义,并且属性为默认。
CacheManager manager = CacheManager.create();
manager.addCache("test");
3. 也可以代码中定义,并且初始化规则。
CacheManager manager = CacheManager.create();
Cache cache = new Cache("test",1,true,false,5,2);
manager.addCache(cache);
然后就到Cache的使用
1. 往Cache中增加元素:
Element element = new Element("key1","value1");
cache.put(element);
2. 往Cache中取得元素:
Element element = cache.get("key1");
3. 从Cache中删除元素:
cache.remove("key1");
最后删除cache.
1. CacheManager manager = .....
manager.removeCache("test");
卸载Cache,关闭Cache。
manager.shutdown();
2.2 结合springmvc使用EHCache
1. 在springmvc中同样需要先创建cacheManager,如下代码:
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="classpath:${ehcache.configFile}" />
</bean>
2. ehcache.xml配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<ehcache updateCheck="false" name="defaultCache">
<!-- EHCache 参数含义
name:cache标识
maxElementsInMemory:设置基于内存的缓存可存放对象的最大数目
maxElementOnDisk:设置基于硬盘的缓存可存放对象的最大数目(现在不设置,基于硬盘IO也会比较耗费时间)
eternal:如果为true,表示对象永远不会过期,此时会忽略tiemToldleSeconds和timeToLiveSeconds属性,默认为false。
timeToldleSeconds:设置允许对象处于空间状态的最长时间。当对象自动最近一次被访问后,如果处于空闲状态的时间超过了
timeToldleSeconds属性值,这个对象就会过期。当对象过期,只有当eternal属性为false,该属性才有
效。如果该属性的值为0,那么就表示该对象可以无限期地存于缓存中。
timeToLiveSeconds必须大于timeToldleSeconds属性,才有意义。不需要配置此项。
overflowToDisk:如果为true,表示当基于内存的缓存中的对象数目达到了maxElementsInMemory界限后,会把溢出的对象写到基于硬盘的缓存中。
注意,如果缓存的对象要写入到硬盘中的话,则该对象必须时间了Serializable接口才行;
memoryStoreEvictionPolicy:缓存清除策略:FIFO,LFU,LRU
-->
<diskStore path="/AdverPlatformManage/ehcache/" />
<!-- 用户相关缓存(包括了用户->角色->权限,三者绑定在一起) -->
<cache
name="userCache"
maxElementsInMemory="200"
eternal="false"
timeToIdleSeconds="3600"
overflowToDisk="false"
memoryStoreEvictionPolicy="LRU"
/>
<!-- 公司相关缓存(包括公司的基本信息)
Ps:认为公司数量不大,而且每个员工都需要有公司的信息,所以公司数据永久保存在内存中
-->
<cache
name="companyCache"
maxElementsInMemory="50"
eternal="true"
overflowToDisk="false"
/>
</ehcache>
3. 使用Cache,如下代码:
3.1 Cache工具类
public class CacheUtils {
private static CacheManager cacheManager = ((CacheManager)SpringContextHolder.getBean("cacheManager"));
public static Object get(String cacheName,String key) {
return get0(cacheName, key);
}
private static Object get0(String cacheName, String key) {
Element element = getCache(cacheName).get(key);
return element == null ? null:element.getObjectValue();
}
public static void put(String cacheName,String key, Object value) {
put0(cacheName, key, value);
}
private static void put0(String cacheName, String key, Object value) {
Element element = new Element(key, value);
getCache(cacheName).put(element);
}
public static void remove(String cacheName,String key) {
remove0(cacheName, key);
}
private static void remove0(String cacheName, String key) {
getCache(cacheName).remove(key);
}
private static Cache getCache(String cacheName){
Cache cache = cacheManager.getCache(cacheName);
if (cache == null) return null;
else return cache;
}
public static CacheManager getCacheManager() {
return cacheManager;
}
}
3.2 业务逻辑的使用
CacheUtils.put("userCache", SecurityUtils.getSubject().getSession().getId().toString(), user);
CacheUtils.put("companyCache", company.getId(), company);
以及
return (User) CacheUtils.get("userCache", SecurityUtils.getSubject().getSession().getId().toString());
三.待研究部分
1. 分布式下使用ehcache性能,或者和其他比起来怎么样。
2. ehcache的原理是什么。
Ps:
1. Cache的关键在于它的命中率。
2. ehcache,key和value都可以是object。
参考:缓存之EHCache(一):
http://blog.youkuaiyun.com/l271640625/article/details/20528573