ehcache簡介及配置

一、java web開發緩存方案,ehcache和redis哪個更好Ehcache
在java項目廣泛的使用。它是一個開源的、設計於提高在數據從RDBMS中取出來的高花費、高延遲採取的一種緩存方案。正因爲Ehcache具有健壯性(基於java開發)、被認證(具有apache 2.0 license)、充滿特色(稍後會詳細介紹),所以被用於大型複雜分佈式web application的各個節點中。
1. 夠快
Ehcache的發行有一段時長了,經過幾年的努力和不計其數的性能測試,Ehcache終被設計於large, high concurrency systems.
2. 夠簡單
開發者提供的接口非常簡單明瞭,從Ehcache的搭建到運用運行僅僅需要的是你寶貴的幾分鐘。其實很多開發者都不知道自己用在用Ehcache,Ehcache被廣泛的運用於其他的開源項目
比如:hibernate
3.夠袖珍
關於這點的特性,官方給了一個很可愛的名字small foot print ,一般Ehcache的發佈版本不會到2M,V 2.2.3 才 668KB。
4. 夠輕量
核心程序僅僅依賴slf4j這一個包,沒有之一!
5.好擴展
Ehcache提供了對大數據的內存和硬盤的存儲,最近版本允許多實例、保存對象高靈活性、提供LRU、LFU、FIFO淘汰算法,基礎屬性支持熱配置、支持的插件多
6.監聽器
緩存管理器監聽器 (CacheManagerListener)和 緩存監聽器(CacheEvenListener),做一些統計或數據一致性廣播挺好用的
搜索如何使用?
夠簡單就是Ehcache的一大特色,自然用起來just so easy!

redis
redis是在memcache之後編寫的,大家經常把這兩者做比較,如果說它是個key-valuestore 的話但是它具有豐富的數據類型,我想暫時把它叫做緩存數據流中心,就像現在物流中心那樣,order、package、store、classification、distribute、end。現在還很流行的LAMP PHP架構 不知道和 redis+mysql 或者 redis + mongodb的性能比較(聽羣裏的人說mongodb分片不穩定)。
先說說reidis的特性

1. 支持持久化
redis的本地持久化支持兩種方式:RDB和AOF。RDB 在redis.conf配置文件裏配置持久化觸發器,AOF指的是redis沒增加一條記錄都會保存到持久化文件中(保存的是這條記錄的生成命令),如果不是用redis做DB用的話還會不要開AOF ,數據太龐大了,重啓恢復的時候是一個巨大的工程!
2.豐富的數據類型
redis 支持 String 、Lists、sets、sorted sets、hashes 多種數據類型,新浪微博會使用redis做nosql主要也是它具有這些類型,時間排序、職能排序、我的微博、發給我的這些功能List 和 sorted set 的強大操作功能息息相關
3.高性能
這點跟memcache很想象,內存操作的級別是毫秒級的比硬盤操作秒級操作自然高效不少,較少了磁頭尋道、數據讀取、頁面交換這些高開銷的操作!這也是NOSQL冒出來的原因吧,應該是高性能
是基於RDBMS的衍生產品,雖然RDBMS也具有緩存結構,但是始終在app層面不是我們想要的那麼操控的。
4.replication
redis提供主從複製方案,跟mysql一樣增量複製而且複製的實現都很相似,這個複製跟AOF有點類似複製的是新增記錄命令,主庫新增記錄將新增腳本發送給從庫,從庫根據腳本生成記錄,這個過程非常快,就看網絡了,一般主從都是在同一個局域網,所以可以說redis的主從近似及時同步,同事它還支持一主多從,動態添加從庫,從庫數量沒有限制。 主從庫搭建,我覺得還是採用網狀模式,如果使用鏈式(master-slave-slave-slave-slave·····)如果第一個slave出現宕機重啓,首先從master 接收 數據恢復腳本,這個是阻塞的,如果主庫數據幾TB的情況恢復過程得花上一段時間,在這個過程中其他的slave就無法和主庫同步了。

5.更新快
這點好像從我接觸到redis到目前爲止 已經發了大版本就4個,小版本沒算過。redis作者是個非常積極的人,無論是郵件提問還是論壇發帖,他都能及時耐心的爲你解答,維護度很高。有人維護的話,讓我們用的也省心和放心。目前作者對redis 的主導開發方向是redis的集羣方向。

所以如果希望簡單就用ehcache,如果開發任務比較複雜,希望得到比較多的支持什麼的就redis
 
 
 
 
 
 
 

EhCache介紹

 

 

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、配置文件介紹(普通緩存) 

Xml代碼 在CODE上查看代碼片派生到我的代碼片
  1. <ehcache>  
  2.     <!-- 指定一個文件目錄,當EHCache把數據寫到硬盤上時,將把數據寫到這個文件目錄下 -->  
  3.     <diskStore path="java.io.tmpdir"/>  
  4.   
  5.     <!-- 設定緩存的默認數據過期策略 -->  
  6.     <defaultCache  
  7.             maxElementsInMemory="10000"  
  8.             eternal="false"  
  9.             overflowToDisk="true"  
  10.             timeToIdleSeconds="0"  
  11.             timeToLiveSeconds="0"  
  12.             diskPersistent="false"  
  13.             diskExpiryThreadIntervalSeconds="120"/>  
  14.        
  15.     <!--     
  16.         設定具體的命名緩存的數據過期策略   
  17.   
  18.         cache元素的屬性:   
  19.             name:緩存名稱   
  20.                
  21.             maxElementsInMemory:內存中最大緩存對象數   
  22.                
  23.             maxElementsOnDisk:硬盤中最大緩存對象數,若是0表示無窮大   
  24.                
  25.             eternal:true表示對象永不過期,此時會忽略timeToIdleSeconds和timeToLiveSeconds屬性,默認爲false   
  26.                
  27.             overflowToDisk:true表示當內存緩存的對象數目達到了maxElementsInMemory界限後,會把溢出的對象寫到硬盤緩存中。注意:如果緩存的對象要寫入到硬盤中的話,則該對象必須實現了Serializable接口才行。   
  28.                
  29.             diskSpoolBufferSizeMB:磁盤緩存區大小,默認爲30MB。每個Cache都應該有自己的一個緩存區。   
  30.                
  31.             diskPersistent:是否緩存虛擬機重啓期數據   
  32.                
  33.             diskExpiryThreadIntervalSeconds:磁盤失效線程運行時間間隔,默認爲120秒   
  34.   
  35.             timeToIdleSeconds: 設定允許對象處於空閒狀態的最長時間,以秒爲單位。當對象自從最近一次被訪問後,如果處於空閒狀態的時間超過了timeToIdleSeconds屬性值,這個對象就會過期,EHCache將把它從緩存中清空。只有當eternal屬性爲false,該屬性纔有效。如果該屬性值爲0,則表示對象可以無限期地處於空閒狀態   
  36.                
  37.             timeToLiveSeconds:設定對象允許存在於緩存中的最長時間,以秒爲單位。當對象自從被存放到緩存中後,如果處於緩存中的時間超過了 timeToLiveSeconds屬性值,這個對象就會過期,EHCache將把它從緩存中清除。只有當eternal屬性爲false,該屬性纔有效。如果該屬性值爲0,則表示對象可以無限期地存在於緩存中。timeToLiveSeconds必須大於timeToIdleSeconds屬性,纔有意義   
  38.   
  39.             memoryStoreEvictionPolicy:當達到maxElementsInMemory限制時,Ehcache將會根據指定的策略去清理內存。可選策略有:LRU(最近最少使用,默認策略)、FIFO(先進先出)、LFU(最少訪問次數)。   
  40.     -->  
  41.     <cache name="CACHE1"  
  42.            maxElementsInMemory="1000"  
  43.            eternal="true"  
  44.            overflowToDisk="true"/>     
  45.               
  46.     <cache name="CACHE2"  
  47.         maxElementsInMemory="1000"  
  48.         eternal="false"  
  49.         timeToIdleSeconds="200"  
  50.         timeToLiveSeconds="4000"  
  51.         overflowToDisk="true"/>  
  52. </ehcache>  
  1. <ehcache>  
  2.     <!-- 指定一個文件目錄,當EHCache把數據寫到硬盤上時,將把數據寫到這個文件目錄下 -->  
  3.     <diskStore path="java.io.tmpdir"/>  
  4.   
  5.     <!-- 設定緩存的默認數據過期策略 -->  
  6.     <defaultCache  
  7.             maxElementsInMemory="10000"  
  8.             eternal="false"  
  9.             overflowToDisk="true"  
  10.             timeToIdleSeconds="0"  
  11.             timeToLiveSeconds="0"  
  12.             diskPersistent="false"  
  13.             diskExpiryThreadIntervalSeconds="120"/>  
  14.       
  15.     <!--    
  16.         設定具體的命名緩存的數據過期策略  
  17.   
  18.         cache元素的屬性:  
  19.             name:緩存名稱  
  20.               
  21.             maxElementsInMemory:內存中最大緩存對象數  
  22.               
  23.             maxElementsOnDisk:硬盤中最大緩存對象數,若是0表示無窮大  
  24.               
  25.             eternal:true表示對象永不過期,此時會忽略timeToIdleSeconds和timeToLiveSeconds屬性,默認爲false  
  26.               
  27.             overflowToDisk:true表示當內存緩存的對象數目達到了maxElementsInMemory界限後,會把溢出的對象寫到硬盤緩存中。注意:如果緩存的對象要寫入到硬盤中的話,則該對象必須實現了Serializable接口才行。  
  28.               
  29.             diskSpoolBufferSizeMB:磁盤緩存區大小,默認爲30MB。每個Cache都應該有自己的一個緩存區。  
  30.               
  31.             diskPersistent:是否緩存虛擬機重啓期數據  
  32.               
  33.             diskExpiryThreadIntervalSeconds:磁盤失效線程運行時間間隔,默認爲120秒  
  34.   
  35.             timeToIdleSeconds: 設定允許對象處於空閒狀態的最長時間,以秒爲單位。當對象自從最近一次被訪問後,如果處於空閒狀態的時間超過了timeToIdleSeconds屬性值,這個對象就會過期,EHCache將把它從緩存中清空。只有當eternal屬性爲false,該屬性纔有效。如果該屬性值爲0,則表示對象可以無限期地處於空閒狀態  
  36.               
  37.             timeToLiveSeconds:設定對象允許存在於緩存中的最長時間,以秒爲單位。當對象自從被存放到緩存中後,如果處於緩存中的時間超過了 timeToLiveSeconds屬性值,這個對象就會過期,EHCache將把它從緩存中清除。只有當eternal屬性爲false,該屬性纔有效。如果該屬性值爲0,則表示對象可以無限期地存在於緩存中。timeToLiveSeconds必須大於timeToIdleSeconds屬性,纔有意義  
  38.   
  39.             memoryStoreEvictionPolicy:當達到maxElementsInMemory限制時,Ehcache將會根據指定的策略去清理內存。可選策略有:LRU(最近最少使用,默認策略)、FIFO(先進先出)、LFU(最少訪問次數)。  
  40.     -->  
  41.     <cache name="CACHE1"  
  42.            maxElementsInMemory="1000"  
  43.            eternal="true"  
  44.            overflowToDisk="true"/>    
  45.              
  46.     <cache name="CACHE2"  
  47.         maxElementsInMemory="1000"  
  48.         eternal="false"  
  49.         timeToIdleSeconds="200"  
  50.         timeToLiveSeconds="4000"  
  51.         overflowToDisk="true"/>  
  52. </ehcache>  

 

3、配置文件介紹(分佈式緩存) 

     1)RMI集羣模式

          A、手工發現

               需要指定節點發現模式peerDiscovery值爲manual,rmiUrls設置爲另一臺服務器的IP、端口和緩存名等信息。

Xml代碼 在CODE上查看代碼片派生到我的代碼片
  1. <cacheManagerPeerProviderFactory    
  2.     class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"    
  3.     properties="peerDiscovery=manual,   
  4.     rmiUrls=//192.168.0.12:4567/oschina_cache|//192.168.0.13:4567/oschina_cache"   
  5. />  
  1. <cacheManagerPeerProviderFactory   
  2.     class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"   
  3.     properties="peerDiscovery=manual,  
  4.     rmiUrls=//192.168.0.12:4567/oschina_cache|//192.168.0.13:4567/oschina_cache"  
  5. />  

  

          B、自動發現

                需要指定節點發現模式peerDiscovery值爲automatic自動,同時組播地址可以指定D類IP地址空間,範圍從 224.0.1.0 到 238.255.255.255 中的任何一個地址。

Xml代碼 在CODE上查看代碼片派生到我的代碼片
  1. <cacheManagerPeerProviderFactory  
  2.     class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"  
  3.     properties="peerDiscovery=automaticmulticastGroupAddress=230.0.0.1,   
  4.     multicastGroupPort=4446timeToLive=32"   
  5. />  
  1. <cacheManagerPeerProviderFactory  
  2.     class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"  
  3.     properties="peerDiscovery=automaticmulticastGroupAddress=230.0.0.1,  
  4.     multicastGroupPort=4446timeToLive=32"  
  5. />  

 

           需要在每個cache屬性中加入 <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"/>

Xml代碼 在CODE上查看代碼片派生到我的代碼片
  1. <cache name="demoCache"  
  2.     maxElementsInMemory="10000"  
  3.     eternal="true"  
  4.     overflowToDisk="true">  
  5.     <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"/>  
  6. </cache>   
  1. <cache name="demoCache"  
  2.     maxElementsInMemory="10000"  
  3.     eternal="true"  
  4.     overflowToDisk="true">  
  5.     <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"/>  
  6. </cache>   

         

4、通過編程方式使用EhCache

Java代碼 在CODE上查看代碼片派生到我的代碼片
  1. //從classes目錄查找ehcache.xml配置文件   
  2. CacheManager cacheManager = CacheManager.getInstance();   
  3.   
  4. //從classes目錄查找指定名稱的配置文件   
  5. //CacheManager cacheManager = CacheManager.create(getClass().getResource("/ehcache.xml"));   
  6.   
  7. //根據配置文件獲得Cache實例   
  8. Cache cache = cacheManager.getCache("CACHE1");   
  9.   
  10. //清空Cache中的所有元素   
  11. cache.removeAll();   
  12.   
  13. //往Cache中添加元素   
  14. cache.put(new Element("s1""11111"));   
  15. cache.put(new Element("s2""22222"));   
  16. cache.put(new Element("s3""33333"));   
  17.   
  18. //從Cache中取得元素   
  19. Element e = cache.get("s3");   
  20. System.out.println(e.getValue());   
  21.   
  22. //卸載緩存管理器   
  23. cacheManager.shutdown();  
  1. //從classes目錄查找ehcache.xml配置文件  
  2. CacheManager cacheManager = CacheManager.getInstance();  
  3.   
  4. //從classes目錄查找指定名稱的配置文件  
  5. //CacheManager cacheManager = CacheManager.create(getClass().getResource("/ehcache.xml"));  
  6.   
  7. //根據配置文件獲得Cache實例  
  8. Cache cache = cacheManager.getCache("CACHE1");  
  9.   
  10. //清空Cache中的所有元素  
  11. cache.removeAll();  
  12.   
  13. //往Cache中添加元素  
  14. cache.put(new Element("s1""11111"));  
  15. cache.put(new Element("s2""22222"));  
  16. cache.put(new Element("s3""33333"));  
  17.   
  18. //從Cache中取得元素  
  19. Element e = cache.get("s3");  
  20. System.out.println(e.getValue());  
  21.   
  22. //卸載緩存管理器  
  23. cacheManager.shutdown();  

 

5、頁面緩存

     在web.xml文件中配置過濾器。此處對test_tag.jsp頁面進行緩存。

Xml代碼 在CODE上查看代碼片派生到我的代碼片
  1. <filter>    
  2.     <filter-name>testPageCachingFilter</filter-name>    
  3.     <filter-class>net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter</filter-class>    
  4. </filter>  
  5. <filter-mapping>    
  6.     <filter-name>testPageCachingFilter</filter-name>    
  7.     <url-pattern>/test_tag.jsp</url-pattern>  
  8. </filter-mapping>  
  1. <filter>   
  2.     <filter-name>testPageCachingFilter</filter-name>   
  3.     <filter-class>net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter</filter-class>   
  4. </filter>  
  5. <filter-mapping>   
  6.     <filter-name>testPageCachingFilter</filter-name>   
  7.     <url-pattern>/test_tag.jsp</url-pattern>  
  8. </filter-mapping>  

  

    在ehcache.xml文件中配置Cache節點。注意:cache的name屬性必需爲SimplePageCachingFilter。

Xml代碼 在CODE上查看代碼片派生到我的代碼片
  1. <cache name="SimplePageCachingFilter"    
  2.    maxElementsInMemory="10"    
  3.    overflowToDisk="true"    
  4.    eternal="false"    
  5.    timeToIdleSeconds="100"    
  6.    timeToLiveSeconds="100"  
  7.    memoryStoreEvictionPolicy="LFU" />  
  1. <cache name="SimplePageCachingFilter"   
  2.    maxElementsInMemory="10"   
  3.    overflowToDisk="true"   
  4.    eternal="false"   
  5.    timeToIdleSeconds="100"   
  6.    timeToLiveSeconds="100"  
  7.    memoryStoreEvictionPolicy="LFU" />  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章