且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

ehcache 使用

更新时间:2022-09-05 13:16:01

引用:http://blog.csdn.net/hz_chenwenbiaotmb/article/details/5754508

一.介绍与应用场景

ehcache是一开源缓存工具,其许可证为Apache License, Version 2.0,非常友好的许可。在 sourceforge.net 上可找到它的最新版本。

缓存应用在多个领域并发挥作用,ehcache可应用于数据库访问缓存,安全认证缓存,web缓存,soap 和 RESTFul 服务缓存,应用程序持久对象缓存以及分布式缓存。

二.架设开发环境

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

 

[xhtml] view plaincopy
  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.         />     
  13. <defaultCache  
  14.             maxElementsInMemory="10000"  
  15.             eternal="false"  
  16.             timeToIdleSeconds="120"  
  17.             timeToLiveSeconds="120"  
  18.             overflowToDisk="true"  
  19.             diskSpoolBufferSizeMB="30"  
  20.             maxElementsOnDisk="10000000"  
  21.             diskPersistent="false"  
  22.             diskExpiryThreadIntervalSeconds="120"  
  23.             memoryStoreEvictionPolicy="LRU"  
  24.             />  

 

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

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代码
[java] view plaincopy
  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代码 
[java] view plaincopy
  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();     
  22.          manager.addCache("sampleCache1");  
  23.   
  24.         //1.取得Cache      
  25.          Cache cache = manager.getCache("sampleCache1");      
  26.               
  27.         //2.执行 CRUD 操作      
  28.         //2.1   增加元素      
  29.          Element element1 = new Element("key1""value1");      
  30.          Element element2 = new Element("key2""value2");      
  31.          cache.put(element1);      
  32.          cache.put(element2);      
  33.         //2.2 更新元素      
  34.          cache.put(new Element("key1""value1u"));      
  35.         //2.3 取值      
  36.         //取得一个序列化了的值      
  37.          Element element231 = cache.get("key1");      
  38.          Serializable value231 = element231.getValue();      
  39.          System.out.println(value231);      
  40.         //取得一个不是序列化的值      
  41.          Element element232 = cache.get("key1");      
  42.          Object value232 = element232.getObjectValue();      
  43.          System.out.println(value232);      
  44.         //3.4 删除一个元素      
  45.          cache.remove("key2");      
  46.          System.out.println(cache.get("key2") == null);      
  47.               
  48.         //3. 强硬命令写入硬盘      
  49.          cache.flush();      
  50.               
  51.         //4. 取得缓存的大小      
  52.         //得到总的缓存数目      
  53.         int elements = cache.getSize();      
  54.          System.out.println(elements);      
  55.         //得到在内存中的元素数量      
  56.         long elementsInMemory = cache.getMemoryStoreSize();      
  57.          System.out.println(elementsInMemory);      
  58.         //得到硬盘中的缓存元素数量      
  59.         long elementsInDisk = cache.getDiskStoreSize();      
  60.          System.out.println(elementsInDisk);      
  61.               
  62.         /**  
  63.           * 在官方文档中有cache.getHitCount();等相关方法,在这里已经找不到  
  64.           * 应该是版本变迁的原因。  
  65.           */     
  66.               
  67.         //5.高级主题 注册mbean 也许在以后的高级主题中会进一步阐述      
  68.          CacheManager manager1 = new CacheManager();      
  69.          MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();      
  70.          ManagementService.registerMBeans(manager1, mBeanServer, falsefalsefalsetrue);      
  71.      
  72.          manager.shutdown();      
  73.      }      
  74. }     
  75. package tutorial;  
  76. import java.io.Serializable;  
  77. import java.lang.management.ManagementFactory;  
  78. import javax.management.MBeanServer;  
  79. import net.sf.ehcache.Cache;  
  80. import net.sf.ehcache.CacheManager;  
  81. import net.sf.ehcache.Element;  
  82. import net.sf.ehcache.management.ManagementService;  
  83. /** 
  84.  * 使用 Caches 
  85.  * @author zhangyt 
  86.  * 
  87.  */  
  88. public class UsingCaches {  
  89.  public static void main(String[] args) {  
  90.   CacheManager.create();  
  91.   CacheManager manager= CacheManager.getInstance();  
  92.   //1.取得Cache  
  93.   Cache cache = manager.getCache("sampleCache1");  
  94.     
  95.   //2.执行 CRUD 操作  
  96.   //2.1  增加元素  
  97.   Element element1 = new Element("key1""value1");  
  98.   Element element2 = new Element("key2""value2");  
  99.   cache.put(element1);  
  100.   cache.put(element2);  
  101.   //2.2 更新元素  
  102.   cache.put(new Element("key1""value1u"));  
  103.   //2.3 取值  
  104.   //取得一个序列化了的值  
  105.   Element element231 = cache.get("key1");  
  106.   Serializable value231 = element231.getValue();  
  107.   System.out.println(value231);  
  108.   //取得一个不是序列化的值  
  109.   Element element232 = cache.get("key1");  
  110.   Object value232 = element232.getObjectValue();  
  111.   System.out.println(value232);  
  112.   //3.4 删除一个元素  
  113.   cache.remove("key2");  
  114.   System.out.println(cache.get("key2") == null);  
  115.     
  116.   //3. 强硬命令写入硬盘  
  117.   cache.flush();  
  118.     
  119.   //4. 取得缓存的大小  
  120.   //得到总的缓存数目  
  121.   int elements = cache.getSize();  
  122.   System.out.println(elements);  
  123.   //得到在内存中的元素数量  
  124.   long elementsInMemory = cache.getMemoryStoreSize();  
  125.   System.out.println(elementsInMemory);  
  126.   //得到硬盘中的缓存元素数量  
  127.   long elementsInDisk = cache.getDiskStoreSize();  
  128.   System.out.println(elementsInDisk);  
  129.     
  130.   /** 
  131.    * 在官方文档中有cache.getHitCount();等相关方法,在这里已经找不到 
  132.    * 应该是版本变迁的原因。 
  133.    */  
  134.     
  135.   //5.高级主题 注册mbean 也许在以后的高级主题中会进一步阐述  
  136.   CacheManager manager1 = new CacheManager();  
  137.      MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();  
  138.      ManagementService.registerMBeans(manager1, mBeanServer, falsefalsefalsetrue);  
  139.   manager.shutdown();  
  140.  }  
  141. }  
看了以上的内容,相信对ehcache就可以进行一般的应用了