ehcache介绍

来源:互联网 发布:在线网络直播 编辑:程序博客网 时间:2024/06/05 07:38
一、简介  ehcache 是一个非常轻量级的缓存实现,而且从1.2 之后就支持了集群,而且是hibernate 默认的缓存provider 。EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。  Ehcache可以直接使用。也可以和Hibernate对象/关系框架结合使用。还可以做Servlet缓存。 Cache 存储方式 :内存或磁盘。  官方网站:
http://ehcache.sourceforge.net/主要特性 1. 快速.  2. 简单.  3. 多种缓存策略   4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题  5. 缓存数据会在虚拟机重启的过程中写入磁盘  6. 可以通过RMI、可插入API等方式进行分布式缓存  7. 具有缓存和缓存管理器的侦听接口   8. 支持多缓存管理器实例,以及一个实例的多个缓存区域  9. 提供Hibernate的缓存实现 二、快速上手  1、 项目类库中添加ehcache.jar;  2、 在类路径下编写ehcache.xml配置文件。 三、配置文件参数详解  ehcache.xml是ehcache的配置文件,并且存放在应用的classpath中。下面是对该XML文件中的一些元素及其属性的相关说明:  <diskStore>元素:指定一个文件目录,当EHCache把数据写到硬盘上时,将把数据写到这个文件目录下。 下面的参数这样解释: user.home – 用户主目录 user.dir – 用户当前工作目录 java.io.tmpdir – 默认临时文件路径  <defaultCache>元素:设定缓存的默认数据过期策略。 
<cache>元素:设定具体的命名缓存的数据过期策略。 <cache>元素的属性  name:缓存名称。通常为缓存对象的类名(非严格标准)。  maxElementsInMemory:设置基于内存的缓存可存放对象的最大数目。 maxElementsOnDisk:设置基于硬盘的缓存可存放对象的最大数目。  eternal:如果为true,表示对象永远不会过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false;   timeToIdleSeconds: 设定允许对象处于空闲状态的最长时间,以秒为单位。当对象自从最近一次被访问后,如果处于空闲状态的时间超过了timeToIdleSeconds属性 值,这个对象就会过期。当对象过期,EHCache将把它从缓存中清空。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示 对象可以无限期地处于空闲状态。  timeToLiveSeconds:设定对象允许存在于缓存中的最长时间,以秒为单位。当对象自从被存放到缓存中后,如果处于缓存中的时间超过了 timeToLiveSeconds属性值,这个对象就会过期。当对象过期,EHCache将把它从缓存中清除。只有当eternal属性为false, 该属性才有效。如果该属性值为0,则表示对象可以无限期地存在于缓存中。timeToLiveSeconds必须大于timeToIdleSeconds 属性,才有意义。  overflowToDisk:如果为true,表示当基于内存的缓存中的对象数目达到了maxElementsInMemory界限后,会把益出 的对象写到基于硬盘的缓存中。注意:如果缓存的对象要写入到硬盘中的话,则该对象必须实现了Serializable接口才行。  memoryStoreEvictionPolicy:缓存对象清除策略。有三种:  1 、FIFO ,first in first out ,这个是大家最熟的,先进先出,不多讲了  2 、LFU , Less Frequently Used ,就是上面例子中使用的策略,直白一点就是讲一直以来最少被使用的。如上面所讲,缓存的元素有一个hit 属性,hit 值最小的将会被清出缓存。  3、 LRU ,Least Recently Used ,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。  Ehcache(二)--

在工程中单独使用   1.创建CacheManager (net.sf.ehcache.CacheManager) (1)使用默认配置文件创建  CacheManager manager = CacheManager.create(); 


二.架设开发环境

无它,只需把ehcache的相关jar包放到classpath下,把配置文件ehcache.xml放在classpath下就可以进行应用开发了。下面是配置文件中默认配置的xml节点的内容

Xml代码

  1. <defaultCache  
  2.         maxElementsInMemory="10000"  
  3.         eternal="false"  
  4.         timeToIdleSeconds="120"  
  5.         timeToLiveSeconds="120"  
  6.         overflowToDisk="true"  
  7.         diskSpoolBufferSizeMB="30"  
  8.         maxElementsOnDisk="10000000"  
  9.         diskPersistent="false"  
  10.         diskExpiryThreadIntervalSeconds="120"  
  11.         memoryStoreEvictionPolicy="LRU"  
  12.         />  

原文件中有比较详尽的注释,在这里我简单翻译几个

1.必须要有的属性:

name: cache的名字,用来识别不同的cache,必须惟一。

maxElementsInMemory: 内存管理的缓存元素数量最大限值。

maxElementsOnDisk: 硬盘管理的缓存元素数量最大限值。默认值为0,就是没有限制。

eternal: 设定元素是否持久话。若设为true,则缓存元素不会过期。

overflowToDisk: 设定是否在内存填满的时候把数据转到磁盘上。

2.下面是一些可选属性:

timeToIdleSeconds: 设定元素在过期前空闲状态的时间,只对非持久性缓存对象有效。默认值为0,值为0意味着元素可以闲置至无限长时间。

timeToLiveSeconds: 设定元素从创建到过期的时间。其他与timeToIdleSeconds类似。

diskPersistent: 设定在虚拟机重启时是否进行磁盘存储,默认为false.(我的直觉,对于安全小型应用,宜设为true)。

diskExpiryThreadIntervalSeconds: 访问磁盘线程活动时间。

diskSpoolBufferSizeMB: 存入磁盘时的缓冲区大小,默认30MB,每个缓存都有自己的缓冲区。

memoryStoreEvictionPolicy: 元素逐出缓存规则。共有三种,Recently Used (LRU)最近最少使用,为默认。 First In First Out (FIFO),先进先出。Less Frequently Used(specified as LFU)最少使用。

三.实例编写

继续以往的作风,用代码说话。代码中有良好的注释。(代码参考字官方文档)

1. 使用 CacheManager

Java代码
  1. package tutorial;   
  2.   
  3. import java.io.File;   
  4. import java.io.FileInputStream;   
  5. import java.io.InputStream;   
  6. import java.net.URL;   
  7.   
  8. import net.sf.ehcache.Cache;   
  9. import net.sf.ehcache.CacheManager;   
  10.   
  11. /**
  12. * 使用 CacheManager
  13. * @author zhangyt
  14. *
  15. */  
  16. public class UsingTheCacheManager {   
  17.     public static void main(String[] args) throws Exception {   
  18.         //1.   
  19.         //创建CacheManager单例对象,使用默认配置   
  20.          CacheManager.create();   
  21.          String[] cacheNames1 = CacheManager.getInstance().getCacheNames();   
  22.         //关闭   
  23.          CacheManager.getInstance().shutdown();   
  24.            
  25.         //2.   
  26.         //用默认配置创建对象可用此创建多例   
  27.          CacheManager manager2 = new CacheManager();   
  28.          String[] cacheNames2 = manager2.getCacheNames();   
  29.          manager2.shutdown();   
  30.            
  31.         //3.加载配置的方式   
  32.         //3.1 用默认配置加载在上面已经提到。即需要在classpath下放置ehcache.xml配置文件   
  33.         //3.2 用指定配置文件路径的方式创建   
  34.          CacheManager manager31 = new CacheManager("src/config/ehcache.xml");   
  35.          manager31.shutdown();   
  36.         //3.2 用classpath下的配置文件生成   
  37.          URL url = UsingTheCacheManager.class.getClassLoader().getResource("config/ehcache.xml");   
  38.          CacheManager manager32 = new CacheManager(url);   
  39.          manager32.shutdown();   
  40.         //3.3 通过输入流生成   
  41.          InputStream fis = new FileInputStream(new File("src/config/ehcache.xml").getAbsolutePath());   
  42.         try {   
  43.              CacheManager manager33 = new CacheManager(fis);   
  44.              manager33.shutdown();   
  45.          } finally {   
  46.              fis.close();   
  47.          }   
  48.            
  49.         //4. 以编程的方式添加和删除cache   
  50.          CacheManager singletonManager4 = CacheManager.create();   
  51.         //4.1 用默认配置添加   
  52.          singletonManager4.addCache("test41");   
  53.          Cache test41 = singletonManager4.getCache("test41");   
  54.          System.out.println(test41 != null);   
  55.         //4.2 创建一个cache并添加到CacheManager   
  56.          Cache memoryOnlyCache = new Cache("test42"5000falsefalse52);   
  57.          singletonManager4.addCache(memoryOnlyCache);   
  58.          Cache test42 = singletonManager4.getCache("test42");   
  59.         //4.3 删除cache   
  60.          singletonManager4.removeCache("sampleCache1");   
  61.          singletonManager4.shutdown();   
  62.      }   
  63. }  

2. 使用 Caches

Java代码
  1. package tutorial;   
  2.   
  3. import java.io.Serializable;   
  4. import java.lang.management.ManagementFactory;   
  5.   
  6. import javax.management.MBeanServer;   
  7.   
  8. import net.sf.ehcache.Cache;   
  9. import net.sf.ehcache.CacheManager;   
  10. import net.sf.ehcache.Element;   
  11. import net.sf.ehcache.management.ManagementService;   
  12.   
  13. /**
  14. * 使用 Caches
  15. * @author zhangyt
  16. *
  17. */  
  18. public class UsingCaches {   
  19.     public static void main(String[] args) {   
  20.          CacheManager.create();   
  21.          CacheManager manager= CacheManager.getInstance();   
             manager.addCache("sampleCache1");
  22.         //1.取得Cache   
  23.          Cache cache = manager.getCache("sampleCache1");   
  24.            
  25.         //2.执行 CRUD 操作   
  26.         //2.1   增加元素   
  27.          Element element1 = new Element("key1""value1");   
  28.          Element element2 = new Element("key2""value2");   
  29.          cache.put(element1);   
  30.          cache.put(element2);   
  31.         //2.2 更新元素   
  32.          cache.put(new Element("key1""value1u"));   
  33.         //2.3 取值   
  34.         //取得一个序列化了的值   
  35.          Element element231 = cache.get("key1");   
  36.          Serializable value231 = element231.getValue();   
  37.          System.out.println(value231);   
  38.         //取得一个不是序列化的值   
  39.          Element element232 = cache.get("key1");   
  40.          Object value232 = element232.getObjectValue();   
  41.          System.out.println(value232);   
  42.         //3.4 删除一个元素   
  43.          cache.remove("key2");   
  44.          System.out.println(cache.get("key2") == null);   
  45.            
  46.         //3. 强硬命令写入硬盘   
  47.          cache.flush();   
  48.            
  49.         //4. 取得缓存的大小   
  50.         //得到总的缓存数目   
  51.         int elements = cache.getSize();   
  52.          System.out.println(elements);   
  53.         //得到在内存中的元素数量   
  54.         long elementsInMemory = cache.getMemoryStoreSize();   
  55.          System.out.println(elementsInMemory);   
  56.         //得到硬盘中的缓存元素数量   
  57.         long elementsInDisk = cache.getDiskStoreSize();   
  58.          System.out.println(elementsInDisk);   
  59.            
  60.         /**
  61.           * 在官方文档中有cache.getHitCount();等相关方法,在这里已经找不到
  62.           * 应该是版本变迁的原因。
  63.           */  
  64.            
  65.         //5.高级主题 注册mbean 也许在以后的高级主题中会进一步阐述   
  66.          CacheManager manager1 = new CacheManager();   
  67.          MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();   
  68.          ManagementService.registerMBeans(manager1, mBeanServer, falsefalsefalsetrue);   
  69.   
  70.          manager.shutdown();   
  71.      }   
  72. }  

看了以上的内容,相信对ehcache就可以进行一般的应用了


0 0
原创粉丝点击