




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Ehcache使用文檔 作者:蘭東平 Email:landongpingpub2012年2月1 基本介紹1.1 前言Ehcache是一個快速的、輕量級的、易于使用的、進(jìn)程內(nèi)的緩存。它支持read-only 和read/write 緩存,內(nèi)存和磁盤緩存。是一個非常輕量級的緩存實現(xiàn),而且從1.2 之后就支持了集群,目前的最新版本是2.5。簡單地說來,ehcache有以下特點:l 快速.l 簡單.l 多種緩存策略l 緩存數(shù)據(jù)有兩級:內(nèi)存和磁盤,因此無需擔(dān)心容量問題l 緩存數(shù)據(jù)會在虛擬機(jī)重啟的過程中寫入磁盤l 可以通過RMI、可插入API 等方式進(jìn)行分布式緩存l 具有緩存和緩存管理器的偵聽接口l 支持
2、多緩存管理器實例,以及一個實例的多個緩存區(qū)域l 提供Hibernate 的緩存實現(xiàn)2 安裝和使用2.1 下載Ehcache的官方網(wǎng)站/downloads/catalog 上面可以下載到各種版本。目前用最新版本是2.5.1,下載這個版本即可。(下載之前,會要求用戶注冊,按照要求輸入即可)。建議下載文件,因為這個文件包含了所有Ehcache的內(nèi)容。2.2 安裝2.2.1 發(fā)布包內(nèi)容說明將解壓到本地文件系統(tǒng)。在安裝之前,我們先來大致看看發(fā)布包里邊的內(nèi)容,如下圖2.1所示。 圖2.1如一般的開源框架發(fā)布包類似,ehcahce的發(fā)布包包含以下目錄內(nèi)容:javadoc:e
3、hcache的API文檔;lib:ehcache要用到的第三方j(luò)ar包和自己的jar包;licenses:ehcache的授權(quán)文件;samples:ehcache的例子目錄;src:ehcache的源代碼目錄;terracotta:使用terracotta集群時的terracotta服務(wù);ehcache.xml:ehcache的配置文件模板,包括各個配置的英文解釋;ehcache.xsd:ehcache.xml文件的驗證文件模板;QUICK-START.html:快速開始文件,會連接到ehcache的官方網(wǎng)站;README.html:ehcache版本功能和新特性說明文件。除了閱讀本文檔快速地
4、學(xué)習(xí)和了解ehcache的功能,也可以通過ehcache自帶的快速開始文件進(jìn)行學(xué)習(xí)。2.2.2 安裝到項目工程Ehcache的安裝方法比較簡單,將解壓開的發(fā)布包下的lib /、lib /和lib/放置到類路徑下面即可使用。如下圖2.2所示: 圖2.2其中,和兩個jar包,用于ehcache的日志輸出,是第三方j(luò)ar包。關(guān)于這兩個jar包的用法和功能特性,請查閱slf4j框架的相關(guān)功能。3 開始一個例子3.1 新建一個空的java project工程通過eclipse向?qū)陆ㄒ粋€Java Project工程ehcache-test,并將上面提的三個類添加到類路徑下。工程如下圖3.1所示: 圖3.
5、1其中的lib目錄,我專門用來存放jar包。3.2 工程中添加配置文件3.2.1 新建配置文件存放目錄在ehcache-test工程中新建專門用于存放配置文件的包,根據(jù)我們的習(xí)慣,該包取名為“conf”。3.2.2 加入ehcache配置文件在剛才新建的conf包下加入發(fā)布包目錄下的ehcache.xml和ehcache.xsd兩個配置文件。(注意,這兩個配置文件要放在同一目錄下。如果需要將ehcache.xsd文件放到其他目錄,需要修改ehcache.xml文件中的xsi:noNamespaceSchemaLocation="ehcache.xsd"配置項)經(jīng)過以上步驟操
6、作,工程目錄結(jié)構(gòu)如下圖3.2所示:3.2.3 修改ehcache.xml配置文件內(nèi)容正如先前所述,ehcache.xml是ehcache的配置文件模板,每一項配置的說明都相當(dāng)詳細(xì)。在修改該配置文件之前,如果大家有興趣,不妨先大致看看其中的內(nèi)容和注釋。為了說明簡單,我們先運(yùn)行ehcache最基本和簡單的例子。配置文件內(nèi)容如下:<?xml version="1.0" encoding="UTF-8"?><ehcache xmlns:xsi=chema-instance"xsi:noNamespaceSchemaLocation=&
7、quot;ehcache.xsd" updateCheck="false"monitoring="autodetect" dynamicConfig="true"><defaultCache maxEntriesLocalHeap="0" eternal="false"overflowToDisk="true" timeToIdleSeconds="1200" timeToLiveSeconds="1200">
8、;</defaultCache><cache name="sampleCache1" maxEntriesLocalHeap="10000"maxEntriesLocalDisk="1000" eternal="false" overflowToDisk="true"diskSpoolBufferSizeMB="20" timeToIdleSeconds="300" timeToLiveSeconds="600"mem
9、oryStoreEvictionPolicy="LFU" transactionalMode="off" /></ehcache>經(jīng)過以上步驟操作,我們的工程如下圖3.2所示: 圖3.23.3 編寫測試類新建名為“ehcache”的包。在“ehcache”包下面新建“TestMain.java”類。TestMain.java文件內(nèi)容使用Junit來編寫,所以我們還需要在工程中添加Junit4。TestMain.java的內(nèi)容很簡單,如下:package ehcache;import .URL;import junit.framework
10、.TestCase;import net.sf.ehcache.Cache;import net.sf.ehcache.CacheManager;import net.sf.ehcache.Element;/* * * author ldp * */public class TestMain Testpublic void testF1() throws Exception URL url = TestMain.class.getClassLoader().getResource("conf/ehcache.xml");CacheManager manager = new
11、CacheManager(url);Cache cache1 = manager.getCache("sampleCache1");String key = "key1"String value = key.hashCode() + ""Element element1 = new Element(key, value);cache1.put(element1);System.out.println(cache1.get(key);manager.shutdown();以上是一個很簡單的測試類,稍后我們再對代碼進(jìn)行分析。3.4 運(yùn)行測
12、試類運(yùn)行上面的TestMain.java類,輸出結(jié)果如下:3.5 代碼解析下面主要對TestMain.java中的testF1()方法進(jìn)行詳細(xì)地解析。代碼片段1:URL url = TestMain.class.getClassLoader().getResource("conf/ehcache.xml");CacheManager manager = new CacheManager(url);這兩行代碼根據(jù)conf/ehcache.xml配置文件新建出一個CacheManager對象。也就是說,一個ehcache.xml文件就對應(yīng)一個CacheManager對象,ehc
13、ache.xml中配置的各個緩存,即為該CacheManager對象實際管理和控制的cache對象。代碼片段2:Cache cache1 = manager.getCache("sampleCache1");通過CacheManager對象獲取其中的指定緩存(sampleCache1)。每個緩存以其name屬性來區(qū)分。代碼片段3:String key = "key1"String value = key.hashCode() + ""新建一個鍵值對。代碼片段4:Element element1 = new Element(key, v
14、alue);cache1.put(element1);System.out.println(cache1.get(key);新建一個Element對象,該對象以剛才的鍵值對為數(shù)據(jù);再將Element對象放入到緩存sampleCache1中;再從緩存sampleCache1中根據(jù)鍵取出存入其中的Element對象。代碼片段5:manager.shutdown();關(guān)閉CacheManager對象,程序運(yùn)行結(jié)束。4 Ehcache的基本原理通過以上的一個簡單的例子,我們已經(jīng)大體了解了一些Ehcache的原理。接下來,我們再比較詳細(xì)地了解下Ehcache的原理。4.1 整體結(jié)構(gòu) Ehcac
15、he的類層次模型主要為三層,最上層的是CacheManager,他是操作Ehcache的入口。我們可以通過CacheManager.getInstance()獲得一個單個的CacheManager,或者通過CacheManager的構(gòu)造函數(shù)創(chuàng)建一個新的CacheManager。每個CacheManager都管理著多個Cache。而每個Cache都以一種類Hash的方式,關(guān)聯(lián)著多個Elemenat。而Element則是我們用于存放要緩存內(nèi)容的地方。Ehcache的整體結(jié)構(gòu)圖如下圖4.1所示。 圖4.1ehcache的刷新策略ehcache的刷新策略是當(dāng)緩存在放入的時候記錄一個放入時間,它是用La
16、zy Evict的方式,在取的時候同設(shè)置的TTL比較。ehcache緩存的3種清空策略:Ø FIFO,先進(jìn)先出Ø LFU,最少被使用,緩存的元素有一個hit屬性,hit值最小的將會被清出緩存。Ø LRU,最近最少使用的,緩存的元素有一個時間戳,當(dāng)緩存容量滿了,而又需要騰出地方來緩存新的元素的時候,那么現(xiàn)有緩存元素中時間戳離當(dāng)前時間最遠(yuǎn)的元素將被清出緩存。事件處理可以為CacheManager添加事件監(jiān)聽,當(dāng)對CacheManager增刪Cache時,事件處理器將會得到通知。要配置事件處理,需要通過ehcache的配置文件來完成??梢詾镃ache添加事件監(jiān)聽,當(dāng)對C
17、ache增刪Element時,事件處理器將會得到通知。要配置事件處理,需要通過ehcache的配置文件來完成。4.2 CacheManager如上文所述,CacheManager是操作Ehcache的入口。其類結(jié)構(gòu)如下:對于CacheManager,我么重點了解它的構(gòu)造函數(shù)。我們可以有兩種模式來創(chuàng)建CacheManager,單例(Singleton)和多例(Instance)。單例創(chuàng)建CacheManager是指通過CacheManager.getInstance()方法或者無參的構(gòu)造函數(shù)CacheManager()創(chuàng)建一個CacheManager對象。這種情況下,系統(tǒng)會在最頂層的classp
18、ath路徑下找名叫ehcache.xml的配置文件,如果查找失敗,會以包中的ehcache-failsafe.xml文件(里邊的緩存配置極其簡單)替代。同時,一個警告會提醒用戶建立自己的配置文件。測試代碼(添加在ehcache-test工程的TestMain.java中,以下同是):Testpublic void testF2() throws Exception CacheManager manager = new CacheManager();manager.addCache("sampleCache1");Cache cache1 = manager.getCache
19、("sampleCache1");String key = "key1"String value = key.hashCode() + ""Element element1 = new Element(key, value);cache1.put(element1);System.out.println(cache1.get(key);manager.shutdown();執(zhí)行結(jié)果如下圖4.2所示: 圖4.2同時,我們也可以看到,當(dāng)我們用代碼“manager.addCache("sampleCache1");”向C
20、acheManager中加入緩存時,系統(tǒng)會自動用ehcache-failsafe.xml中的<defaultCache>項的配置創(chuàng)建出一個name為“sampleCache1”的cache。多例創(chuàng)建CacheManager的方法和先前的testF1()方法一致。CacheManager支持多種方式創(chuàng)建:Configuration對象、InputStream對象、配置文件路徑字符串和URL對象。如果大家有興趣,都可以去嘗試一下。特別地,對于多例創(chuàng)建CacheManager,我們需要指定CacheManager的name屬性,系統(tǒng)不允許多個相同name的CacheManager存在;另
21、外,對于一些資源,如當(dāng)設(shè)置了cache內(nèi)存占用空間滿了后,就將緩存數(shù)據(jù)存放到物理硬盤上(Cache的overflowToDisk屬性),每個CacheManager對象的diskStore配置路徑不能有重復(fù)。關(guān)于diskStore的詳細(xì)配置說明,請參照ehcache.xml模板文件。4.3 Ehcache接口所有的cache都實現(xiàn)此接口,每個cache有自己的name和其他屬性,cache中存放Element對象數(shù)據(jù)。Cache中的Element對象一般存儲在MemoryStore里邊,我們也可以配置將其存儲到DiskStore配置指定的文件路徑下邊。該接口的結(jié)構(gòu)如下:4.4 ElementE
22、lement對象是存儲在cache對象中的最基本元素,主要由鍵、值和訪問記錄三部分信息要素構(gòu)成。如果cache的配置只是讓Element存放在MemoryStore中,對Element對象存儲的值沒有特殊要求;如果cache配置讓Element對象存放在DiskStore中,或者在集群環(huán)境里cache信息復(fù)制時,則要求Element對象存儲的值是可序列化的(Serializable)。如果不可序列化的對象被放到DiskStore中,或者集群中復(fù)制,則這些信息將被丟失,不會有error產(chǎn)生,只產(chǎn)生debug級別的日志。Element類的結(jié)構(gòu)如下所示:5 集群環(huán)境下使用緩存Ehcache支持多種集
23、群環(huán)境下的使用。不同的集群環(huán)境,ehcache.xml的配置不一樣。Ehcache支持以下五種集群方式:l Terracottal RMIl JMSl JGroupsl EhCache Server我們主要看最常用的一種方式:RMI。5.1 RMI 集群模式RMI 是 Java 的一種遠(yuǎn)程方法調(diào)用技術(shù),是一種點對點的基于 Java 對象的通訊方式。EhCache 從 1.2 版本開始就支持 RMI 方式的緩存集群。在集群環(huán)境中 EhCache 所有緩存對象的鍵和值都必須是可序列化的,也就是必須實現(xiàn) java.io.Serializable 接口,這點在其它集群方式下也是需要遵守的。5.1.1
24、RMI集群模式結(jié)構(gòu)及原理RMI 集群模式的結(jié)構(gòu)如下圖5.1所示: 圖5.1采用 RMI 集群模式時,集群中的每個節(jié)點都是對等關(guān)系,并不存在主節(jié)點或者從節(jié)點的概念,因此節(jié)點間必須有一個機(jī)制能夠互相認(rèn)識對方,必須知道其它節(jié)點的信息,包括主機(jī)地址、端口號等。EhCache 提供兩種節(jié)點的發(fā)現(xiàn)方式:手工配置和自動發(fā)現(xiàn)。手工配置方式要求在每個節(jié)點中配置其它所有節(jié)點的連接信息,一旦集群中的節(jié)點發(fā)生變化時,需要對緩存進(jìn)行重新配置。由于RMI是Java 中內(nèi)置支持的技術(shù),因此使用 RMI 集群模式時,無需引入其它的Jar包,Ehcache 本身就帶有支持 RMI 集群的功能。使用 RMI 集群模式需要在ehc
25、ache.xml 配置文件中定義 cacheManagerPeerProviderFactory 節(jié)點。5.1.2 RMI集群例子我們可以按照以下步驟來進(jìn)行來完成這個例子:1) 按照第3章相同的方法新建一個java工程ehcache-test-b;我們工作空間工程結(jié)構(gòu)如下圖5.2所示: 圖5.2(注意:ehcache-test-b工程的測試類名為TestMainB,以方便后續(xù)在Eclipse的console里區(qū)分)2) 修改ehcache.xml配置文件; 為了保存先前的成果,我們新建一份名為ehcache_cluster.xml的配置文件。 ehcache_cluster.xml配置文件的內(nèi)
26、容為:<?xml version="1.0" encoding="UTF-8"?><ehcache xmlns:xsi="/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="false"monitoring="autodetect" dynamicConfig="true"><disk
27、Store path="user.home" /><!- 指定除自身之外的網(wǎng)絡(luò)群體中其他提供同步的主機(jī)列表,用“|”分開不同的主機(jī) -><cacheManagerPeerProviderFactoryclass="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"properties="peerDiscovery=manual,rmiUrls=/:60000/UserCache|/:40000/UserCach
28、e" /><!- 配宿主主機(jī)配置監(jiān)聽程序,來發(fā)現(xiàn)其他主機(jī)發(fā)來的同步請求 -><cacheManagerPeerListenerFactoryclass="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"properties="port=40000,socketTimeoutMillis=120000" /><!- 默認(rèn)緩存 -><defaultCache maxElementsInMemory="10000&q
29、uot; eternal="false"timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000"diskPersistent="false" diskExpiryThreadIntervalSeconds="120"memoryStoreEvict
30、ionPolicy="LRU"></defaultCache><!- 緩存 -><cache name="UserCache" maxElementsInMemory="10000" eternal="false"timeToIdleSeconds="100000" timeToLiveSeconds="100000" overflowToDisk="false"><cacheEventListenerFac
31、toryclass="net.sf.ehcache.distribution.RMICacheReplicatorFactory" /><bootstrapCacheLoaderFactoryclass="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"properties="bootstrapAsynchronously=false" /></cache></ehcache> 然后,將ehcache-test工程的ehca
32、che_cluster.xml拷貝一份到ehcache-test-b工程對應(yīng)目錄下;修改ehcache-test-b工程中的ehcache_cluster.xml中的cacheManagerPeerProviderFactory配置項內(nèi)容為:<!- 配宿主主機(jī)配置監(jiān)聽程序,來發(fā)現(xiàn)其他主機(jī)發(fā)來的同步請求 -><cacheManagerPeerListenerFactoryclass="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"properties="port=600
33、00,socketTimeoutMillis=120000" />修改完配置文件后的工程結(jié)構(gòu)如下圖5.3所示: 圖5.33) 編寫java測試方法在ehcache-test工程的TestMain.java文件中添加以下代碼:Testpublic void testF3() throws Exception URL url = TestMain.class.getClassLoader().getResource("conf/ehcache_cluster.xml");CacheManager manager = new CacheManager(url);C
34、ache cache1 = manager.getCache("UserCache");String key = "key1"String value = key.hashCode() + ""Element element1 = new Element(key, value);cache1.put(element1);System.out.println(cache1.get(key);manager.shutdown();在ehcache-test-b工程的TestMainB.java文件中添加以下代碼:Testpublic vo
35、id testF3() throws Exception URL url = TestMainB.class.getClassLoader().getResource("conf/ehcache_cluster.xml");CacheManager manager = new CacheManager(url);Cache cache1 = manager.getCache("UserCache");while (true) String key = "key1"System.out.println("get value b
36、y aaa");Element element = cache1.get(key);if (element != null) System.out.println(element.getValue();break;Thread.sleep(1000);manager.shutdown();4) 運(yùn)行測試程序; 先運(yùn)行ehcache-test-b工程的TestMainB.java文件中testF3()方法,再運(yùn)行ehcache-test工程的TestMain.java文件中testF3()方法。在正常情況下,不久會,程序就可運(yùn)行完成。ehcache-test-b工程運(yùn)行的結(jié)果如下圖5.
37、4所示: 圖5.4ehcache-test工程運(yùn)行的結(jié)果如下圖5.5所示: 圖5.5我們可以看到,正如我們所說,集群下的緩存數(shù)據(jù)同步實現(xiàn)了。5.1.3 RMI集群配置文件說明要實現(xiàn)RMI集群環(huán)境下緩存數(shù)據(jù)同步,我們只要修改好緩存配置文件就可以了。配置文件片段1:<!- 指定除自身之外的網(wǎng)絡(luò)群體中其他提供同步的主機(jī)列表,用“|”分開不同的主機(jī) -><cacheManagerPeerProviderFactoryclass="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"prope
38、rties="peerDiscovery=manual,rmiUrls=/:60000/UserCache|/:40000/UserCache" />此段配置定義了網(wǎng)絡(luò)集群環(huán)境中其他提供數(shù)據(jù)同步的主機(jī)聲明。Properties屬性主要由兩個屬性,peerDiscovery和rmiUrls。其說明如下:peerDiscovery= automatic:自動發(fā)現(xiàn)其他主機(jī);peerDiscovery= manual:指定其他主機(jī)列表。當(dāng)peerDiscovery= automatic時,我們還需要指定以下屬性值:multicastGrou
39、pAddress:組播地址;如multicastGroupPort:組播主機(jī)端口;如60000timeToLive:組播傳播范圍;如32當(dāng)peerDiscovery= manual時,正如上面例子一樣,我們只需要列出所有的其他主機(jī)列表,例如:rmiUrls=/:60000/UserCache|/:40000/UserCache為了配置方便,我們可以把本機(jī)也配置在主機(jī)列表中,如例子所示。配置文件片段2:<!- 配宿主主機(jī)配置監(jiān)聽程序,來發(fā)現(xiàn)其他主機(jī)發(fā)來的同步請求 -><cacheManagerPeerListenerFactoryclass=
40、"net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"properties="port=40000,socketTimeoutMillis=120000" />正如注釋描述的,此處申明本機(jī)的ip和端口號,以使得其他主機(jī)能發(fā)現(xiàn)本機(jī)。Properties可以配置的屬性如下:hostName:主機(jī)ip;port:主機(jī)端口號;如60000socketTimeoutMillis:socket超時時間設(shè)置;如120000配置文件片段3:<!- 緩存 -><cache name="UserCache" maxElementsInMemory="10000" eternal="false"timeToIdleSeconds="
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 出門演出合同范本
- 低價改造廠房合同范本
- 農(nóng)家葡萄售賣合同范本
- 保險分銷服務(wù)合同范本
- 個人過橋資金合同范本
- 協(xié)議酒店價格合同范本
- 保險變更合同范本
- 企業(yè)對外投資合同范本
- 個人門店裝修合同范本
- 醫(yī)療公司供貨合同范本
- 《國際金融》課件國際金融導(dǎo)論
- 各種el34名膽電子管評測
- 超分子化學(xué)-杯芳烴課件
- 車標(biāo)識別 課講義件課件
- 一年級下學(xué)期安全教育教案
- 哈薩克斯坦共和國勞動法解讀
- 送達(dá)地址確認(rèn)書(樣本)
- 甘肅省酒泉市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名明細(xì)
- 壓力容器考試審核考試題庫(容標(biāo)委-氣體協(xié)會聯(lián)合)
- 學(xué)校食堂操作流程圖
- DB13 2795-2018 大清河流域水污染物排放標(biāo)準(zhǔn)
評論
0/150
提交評論