http://chenjumin.iteye.com/blog/684926
ehcache是一個非常輕量級的緩存實現,而且從1.2之後就支持了集羣,而且是hibernate默認的緩存provider。EhCache 是一個純Java的進程內緩存框架,具有快速、精幹等特點,是Hibernate中默認的CacheProvider。
Ehcache的分佈式緩存有傳統的RMI,1.5版的JGroups,1.6版的JMS。分佈式緩存主要解決集羣環境中不同的服務器間的數據的同步問題。
使用Spring的AOP進行整合,可以靈活的對方法的返回結果對象進行緩存。
CachingFilter功能可以對HTTP響應的內容進行緩存。
1、主要特性
1. 快速.
2. 簡單.
3. 多種緩存策略
4. 緩存數據有兩級:內存和磁盤,因此無需擔心容量問題
5. 緩存數據會在虛擬機重啓的過程中寫入磁盤
6. 可以通過RMI、可插入API等方式進行分佈式緩存
7. 具有緩存和緩存管理器的偵聽接口
8. 支持多緩存管理器實例,以及一個實例的多個緩存區域
9. 提供Hibernate的緩存實現
10. 等等
2、配置文件介紹(普通緩存)
- <ehcache>
- <!-- 指定一個文件目錄,當EHCache把數據寫到硬盤上時,將把數據寫到這個文件目錄下 -->
- <diskStore path="java.io.tmpdir"/>
- <!-- 設定緩存的默認數據過期策略 -->
- <defaultCache
- maxElementsInMemory="10000"
- eternal="false"
- overflowToDisk="true"
- timeToIdleSeconds="0"
- timeToLiveSeconds="0"
- diskPersistent="false"
- diskExpiryThreadIntervalSeconds="120"/>
- <!--
- 設定具體的命名緩存的數據過期策略
- cache元素的屬性:
- name:緩存名稱
- maxElementsInMemory:內存中最大緩存對象數
- maxElementsOnDisk:硬盤中最大緩存對象數,若是0表示無窮大
- eternal:true表示對象永不過期,此時會忽略timeToIdleSeconds和timeToLiveSeconds屬性,默認爲false
- overflowToDisk:true表示當內存緩存的對象數目達到了maxElementsInMemory界限後,會把溢出的對象寫到硬盤緩存中。注意:如果緩存的對象要寫入到硬盤中的話,則該對象必須實現了Serializable接口才行。
- diskSpoolBufferSizeMB:磁盤緩存區大小,默認爲30MB。每個Cache都應該有自己的一個緩存區。
- diskPersistent:是否緩存虛擬機重啓期數據
- diskExpiryThreadIntervalSeconds:磁盤失效線程運行時間間隔,默認爲120秒
- timeToIdleSeconds: 設定允許對象處於空閒狀態的最長時間,以秒爲單位。當對象自從最近一次被訪問後,如果處於空閒狀態的時間超過了timeToIdleSeconds屬性值,這個對象就會過期,EHCache將把它從緩存中清空。只有當eternal屬性爲false,該屬性纔有效。如果該屬性值爲0,則表示對象可以無限期地處於空閒狀態
- timeToLiveSeconds:設定對象允許存在於緩存中的最長時間,以秒爲單位。當對象自從被存放到緩存中後,如果處於緩存中的時間超過了 timeToLiveSeconds屬性值,這個對象就會過期,EHCache將把它從緩存中清除。只有當eternal屬性爲false,該屬性纔有效。如果該屬性值爲0,則表示對象可以無限期地存在於緩存中。timeToLiveSeconds必須大於timeToIdleSeconds屬性,纔有意義
- memoryStoreEvictionPolicy:當達到maxElementsInMemory限制時,Ehcache將會根據指定的策略去清理內存。可選策略有:LRU(最近最少使用,默認策略)、FIFO(先進先出)、LFU(最少訪問次數)。
- -->
- <cache name="CACHE1"
- maxElementsInMemory="1000"
- eternal="true"
- overflowToDisk="true"/>
- <cache name="CACHE2"
- maxElementsInMemory="1000"
- eternal="false"
- timeToIdleSeconds="200"
- timeToLiveSeconds="4000"
- overflowToDisk="true"/>
- </ehcache>
3、配置文件介紹(分佈式緩存)
1)RMI集羣模式
A、手工發現
需要指定節點發現模式peerDiscovery值爲manual,rmiUrls設置爲另一臺服務器的IP、端口和緩存名等信息。
- <cacheManagerPeerProviderFactory
- class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
- properties="peerDiscovery=manual,
- rmiUrls=//192.168.0.12:4567/oschina_cache|//192.168.0.13:4567/oschina_cache"
- />
B、自動發現
需要指定節點發現模式peerDiscovery值爲automatic自動,同時組播地址可以指定D類IP地址空間,範圍從 224.0.1.0 到 238.255.255.255 中的任何一個地址。
- <cacheManagerPeerProviderFactory
- class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
- properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1,
- multicastGroupPort=4446, timeToLive=32"
- />
需要在每個cache屬性中加入
<cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"/>
- <cache name="demoCache"
- maxElementsInMemory="10000"
- eternal="true"
- overflowToDisk="true">
- <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"/>
- </cache>
4、通過編程方式使用EhCache
- //從classes目錄查找ehcache.xml配置文件
- CacheManager cacheManager = CacheManager.getInstance();
- //從classes目錄查找指定名稱的配置文件
- //CacheManager cacheManager = CacheManager.create(getClass().getResource("/ehcache.xml"));
- //根據配置文件獲得Cache實例
- Cache cache = cacheManager.getCache("CACHE1");
- //清空Cache中的所有元素
- cache.removeAll();
- //往Cache中添加元素
- cache.put(new Element("s1", "11111"));
- cache.put(new Element("s2", "22222"));
- cache.put(new Element("s3", "33333"));
- //從Cache中取得元素
- Element e = cache.get("s3");
- System.out.println(e.getValue());
- //卸載緩存管理器
- cacheManager.shutdown();
5、頁面緩存
在web.xml文件中配置過濾器。此處對test_tag.jsp頁面進行緩存。
- <filter>
- <filter-name>testPageCachingFilter</filter-name>
- <filter-class>net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>testPageCachingFilter</filter-name>
- <url-pattern>/test_tag.jsp</url-pattern>
- </filter-mapping>
在ehcache.xml文件中配置Cache節點。注意:cache的name屬性必需爲SimplePageCachingFilter。
- <cache name="SimplePageCachingFilter"
- maxElementsInMemory="10"
- overflowToDisk="true"
- eternal="false"
- timeToIdleSeconds="100"
- timeToLiveSeconds="100"
- memoryStoreEvictionPolicy="LFU" />