天天看點

ehcache 使用

一.介紹與應用場景

ehcache是一開源緩存工具,其許可證為Apache License, Version 2.0,非常友好的許可。在 sourceforge.net 上可找到它的最新版本。

緩存應用在多個領域并發揮作用,ehcache可應用于資料庫通路緩存,安全認證緩存,web緩存,soap 和 RESTFul 服務緩存,應用程式持久對象緩存以及分布式緩存。

二.架設開發環境

無它,隻需把ehcache的相關jar包放到classpath下,把配置檔案ehcache.xml放在classpath下就可以進行應用開發了。下面是配置檔案中預設配置的xml節點的内容

[xhtml] ​​view plain​​​​copy​​

  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 plain​​​​copy​​

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

2. 使用 Caches

Java代碼 

  1. import java.io.Serializable;      
  2. import java.lang.management.ManagementFactory;      
  3. import javax.management.MBeanServer;      
  4. import net.sf.ehcache.Element;      
  5. import net.sf.ehcache.management.ManagementService;      
  6. * 使用 Caches  
  7. public class UsingCaches {      
  8.     public static void main(String[] args) {      
  9.          CacheManager manager= CacheManager.getInstance();     
  10.          manager.addCache("sampleCache1");  
  11.         //1.取得Cache      
  12.          Cache cache = manager.getCache("sampleCache1");      
  13.         //2.執行 CRUD 操作      
  14.         //2.1   增加元素      
  15.          Element element1 = new Element("key1", "value1");      
  16.          Element element2 = new Element("key2", "value2");      
  17.          cache.put(element1);      
  18.          cache.put(element2);      
  19.         //2.2 更新元素      
  20.          cache.put(new Element("key1", "value1u"));      
  21.         //2.3 取值      
  22.         //取得一個序列化了的值      
  23.          Element element231 = cache.get("key1");      
  24.          Serializable value231 = element231.getValue();      
  25.          System.out.println(value231);      
  26.         //取得一個不是序列化的值      
  27.          Element element232 = cache.get("key1");      
  28.          Object value232 = element232.getObjectValue();      
  29.          System.out.println(value232);      
  30.         //3.4 删除一個元素      
  31.          cache.remove("key2");      
  32.          System.out.println(cache.get("key2") == null);      
  33.         //3. 強硬指令寫入硬碟      
  34.          cache.flush();      
  35.         //4. 取得緩存的大小      
  36.         //得到總的緩存數目      
  37.         int elements = cache.getSize();      
  38.          System.out.println(elements);      
  39.         //得到在記憶體中的元素數量      
  40.         long elementsInMemory = cache.getMemoryStoreSize();      
  41.          System.out.println(elementsInMemory);      
  42.         //得到硬碟中的緩存元素數量      
  43.         long elementsInDisk = cache.getDiskStoreSize();      
  44.          System.out.println(elementsInDisk);      
  45.         /**  
  46.           * 在官方文檔中有cache.getHitCount();等相關方法,在這裡已經找不到  
  47.           * 應該是版本變遷的原因。  
  48.           */     
  49.         //5.進階主題 注冊mbean 也許在以後的進階主題中會進一步闡述      
  50.          CacheManager manager1 = new CacheManager();      
  51.          MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();      
  52.          ManagementService.registerMBeans(manager1, mBeanServer, false, false, false, true);      
  53.          manager.shutdown();      
  54. }     
  55. package tutorial;  
  56. import java.io.Serializable;  
  57. import java.lang.management.ManagementFactory;  
  58. import javax.management.MBeanServer;  
  59. import net.sf.ehcache.Cache;  
  60. import net.sf.ehcache.CacheManager;  
  61. import net.sf.ehcache.Element;  
  62. import net.sf.ehcache.management.ManagementService;  
  63. /** 
  64.  * 使用 Caches 
  65.  * @author zhangyt 
  66.  * 
  67.  */  
  68. public class UsingCaches {  
  69.  public static void main(String[] args) {  
  70.   CacheManager.create();  
  71.   CacheManager manager= CacheManager.getInstance();  
  72.   //1.取得Cache  
  73.   Cache cache = manager.getCache("sampleCache1");  
  74.   //2.執行 CRUD 操作  
  75.   //2.1  增加元素  
  76.   Element element1 = new Element("key1", "value1");  
  77.   Element element2 = new Element("key2", "value2");  
  78.   cache.put(element1);  
  79.   cache.put(element2);  
  80.   //2.2 更新元素  
  81.   cache.put(new Element("key1", "value1u"));  
  82.   //2.3 取值  
  83.   //取得一個序列化了的值  
  84.   Element element231 = cache.get("key1");  
  85.   Serializable value231 = element231.getValue();  
  86.   System.out.println(value231);  
  87.   //取得一個不是序列化的值  
  88.   Element element232 = cache.get("key1");  
  89.   Object value232 = element232.getObjectValue();  
  90.   System.out.println(value232);  
  91.   //3.4 删除一個元素  
  92.   cache.remove("key2");  
  93.   System.out.println(cache.get("key2") == null);  
  94.   //3. 強硬指令寫入硬碟  
  95.   cache.flush();  
  96.   //4. 取得緩存的大小  
  97.   //得到總的緩存數目  
  98.   int elements = cache.getSize();  
  99.   System.out.println(elements);  
  100.   //得到在記憶體中的元素數量  
  101.   long elementsInMemory = cache.getMemoryStoreSize();  
  102.   System.out.println(elementsInMemory);  
  103.   //得到硬碟中的緩存元素數量  
  104.   long elementsInDisk = cache.getDiskStoreSize();  
  105.   System.out.println(elementsInDisk);  
  106.   /** 
  107.    * 在官方文檔中有cache.getHitCount();等相關方法,在這裡已經找不到 
  108.    * 應該是版本變遷的原因。 
  109.    */  
  110.   //5.進階主題 注冊mbean 也許在以後的進階主題中會進一步闡述  
  111.   CacheManager manager1 = new CacheManager();  
  112.      MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();  
  113.      ManagementService.registerMBeans(manager1, mBeanServer, false, false, false, true);  
  114.   manager.shutdown();  
  115.  }  
  116. }  

看了以上的内容,相信對ehcache就可以進行一般的應用了