EHCache概念,配置文件,使用示例

来源:互联网 发布:steam mac版怎么安装 编辑:程序博客网 时间:2024/06/15 11:11
一. 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.csdn.net/l271640625/article/details/20528573

0 0
原创粉丝点击