ehcache是一個用Java實現(xiàn)的使用簡單,高速,實現(xiàn)線程安全的緩存管理類庫,ehcache提供了用內(nèi)存,磁盤文件存儲,以及分布式存儲方式等多種靈活的cache管理方案。同時ehcache作為開放源代碼項目,采用限制比較寬松的ApacheLicense V2.0作為授權方式,被廣泛地用于Hibernate,Spring,Cocoon等其他開源系統(tǒng)。
Ehcache的類層次模型主要為三層,最上層的是CacheManager,他是操作Ehcache的入口。我們可以通過CacheManager.getInstance()獲得一個單個的CacheManager,或者通過CacheManager的構造函數(shù)創(chuàng)建一個新的CacheManager。每個CacheManager都管理著多個Cache。而每個Cache都以一種類Hash的方式,關聯(lián)著多個Elemenat。而Element則是我們用于存放要緩存內(nèi)容的地方。
ehcache的刷新策略
ehcache的刷新策略是當緩存在放入的時候記錄一個放入時間,它是用Lazy Evict的方式,在取的時候同設置的TTL比較
ehcache緩存的3種清空策略:
1 FIFO,先進先出
2 LFU,最少被使用,緩存的元素有一個hit屬性,hit值最小的將會被清出緩存。
3LRU,最近最少使用的,緩存的元素有一個時間戳,當緩存容量滿了,而又需要騰出地方來緩存新的元素的時候,那么現(xiàn)有緩存元素中時間戳離當前時間最遠的元素將被清出緩存。
事件處理
可以為CacheManager添加事件監(jiān)聽,當對CacheManager增刪Cache時,事件處理器將會得到通知。要配置事件處理,需要通過ehcache的配置文件來完成。
可以為Cache添加事件監(jiān)聽,當對Cache增刪Element時,事件處理器將會得到通知。要配置事件處理,需要通過ehcache的配置文件來完成。
ehcache參數(shù)配置:
maxInMemory - 設定內(nèi)存中創(chuàng)建對象的最大值。
eternal - 設置元素(譯注:內(nèi)存中對象)是否永久駐留。如果是,將忽略超時限制且元素永不消亡。
timeToIdleSeconds -設置某個元素消亡前的停頓時間。也就是在一個元素消亡之前,兩次訪問時間的最大時間間隔值。這只能在元素不是永久駐留時有效(譯注:如果對象永恒不滅,則設置該屬性也無用)。
如果該值是 0 就意味著元素可以停頓無窮長的時間。
timeToLiveSeconds -為元素設置消亡前的生存時間。也就是一個元素從構建到消亡的最大時間間隔值。這只能在元素不是永久駐留時有效。
overflowToDisk - 設置當內(nèi)存中緩存達到maxInMemory限制時元素是否可寫到磁盤上。
- 1.ehcache使用了LinkedHashMap來存放Element。jdk要1.5以上。Ehcache1.5可以使用jdk1.4
- 如果在添加Elemtent時,緩存中的Element個數(shù)達到了最大緩存數(shù)并且overflowToDisk配置的屬性為true,Ehcache會更具配置項MemoryStoreEvictionPolicy的失效策略將Element輸出到磁盤。如果overflowToDisk為fasle,Ehcache將刪除內(nèi)存中Element
- 值得注意的是緩存中失效的Element并不會別馬上清理掉,所以想得到內(nèi)存的真實大小應該調(diào)用方法calculateInMemorySize()方法。
- 一個ehcache.xml對應一個CacheManager
- 不同的緩存應該對應不同的硬盤上的路徑,否則會報錯
- 注意要想使用磁盤緩存,緩存的Element必須實現(xiàn)序列化接口。否則會拋出NotSerializableException異常。
- Ehcache會將每個緩存配置的文件路徑下創(chuàng)建一個cache_name.data文件,如果使用的磁盤持久化技術,還會生成一個cachename.index文件。
- 8.Ehcache有一個后臺線程專門做Ellment失效監(jiān)測以及清除工作。設置線程運行間隔時間,可通過設置diskExpiryThreadIntervalSeconds屬性來完成,此值不宜設置過低,否則會導致清理線程占用大量CPU資源。默認值是120秒。
- 9.持久化可在Element的diskPersistent配置項中配置,如果配置為“false”或是“omitted”在CacheManagershutdown或是startup后,用來緩存Element的文件將被清除掉。如果設置為“true”,data和index文件會被保存下來,對于新創(chuàng)建的CacheManagerElement也是可用的。
- 使用時必須顯示調(diào)用cache. Flush()才會將數(shù)據(jù)緩存到磁盤中。
- 磁盤緩存步驟:從MemoryStore中把沒有失效的Element刷新到DiskStore,Element被寫入到data文件,Element將被序列化到index文件。
- 12.磁盤緩存大小默認是沒有限制的,不過可通過maxElementsOnDisk來指定。當磁盤緩存達到maxElementsOnDisk指定的值時,Ehcache會清理磁盤中的緩存使用默認策略是LFU(使用頻率最低)。
- 13.在使用完Ehcache后,必須要shutdown緩存。Ehcache中有自己的關閉機制,不過最好在你的代碼中顯示調(diào)用CacheManager.getInstance().shutdown();
- 14.Cache:對于getValue()能取到可序列化的值;getObjectValue()取得非序列化的值
- 15.cache.getSize();得到緩存中元素的個數(shù);獲得當前MemoryStore中的element數(shù)量:cache.getMemoryStoreSize();獲得當前DiskStore中element數(shù)量:cache.getDiskStoreSize();
- 16.在使用完Ehcache后,必須要shutdown緩存。Ehcache中有自己的關閉機制,不過最好在你的代碼中顯示調(diào)用CacheManager.getInstance().shutdown();
- 17.ehcache-core-1.6—1.7沒有任何依賴;ehcache1.7.1依賴SLF4J,以及相應的log的jar包。
- 18.CacheManager可以通過單例(factory的靜態(tài)方法)或者構造函數(shù)(constructors)創(chuàng)建。分別叫做singlemodel和instancemodel。當兩種情況都有的時候,系統(tǒng)會采用單例模式,構造器每次都生成單例模式
- 19.對于想存儲數(shù)據(jù)到硬盤,或者集群時復制到其他緩存區(qū)域的數(shù)據(jù),必須可序列化。如果不可序列化,該數(shù)據(jù)在進行上述操作時會被丟棄,且沒有報錯,只是在debug級別有日志信息。
- 20.讀取cache的數(shù)據(jù),有以下幾種方式:
Cache-aside:直接操作數(shù)據(jù)
Cache-as-sor:read-through、write-through和write-behind的結合
Read-through:
Write-through:
Write-behind:
- 21.從ehcache2.0開始,以下屬性可以在運行時改變:
• timeToLive
• timeToIdle
• maxElementsInMemory
• maxElementsOnDisk
• memory store eviciton policy
• CacheEventListeners can be added and removed dynamically []
當eternal屬性為“true”時,timeToLive和timeToIdle會失效
- 22.以下代碼演示怎么運行時修改緩存屬性
This example shows howto dynamically modify the cache configuration of an already runningcache:
Cache cache =manager.getCache("sampleCache");
CacheConfigurationconfig = cache.getCacheConfiguration();
config.setTimeToIdleSeconds(60);
config.setTimeToLiveSeconds(120);
config.setMaxElementsInMemory(10000);
config.setMaxElementsOnDisk(1000000);
Dynamic cacheconfigurations can also be frozen to prevent futurechanges:
Cache cache =manager.getCache("sampleCache");
cache.disableDynamicFeatures();
- 23.2.5之前是通過元素的個數(shù)來表示內(nèi)存或者硬盤的大??;2.5之后,通過字節(jié)數(shù)來表示。2.5暫時還沒有出來。新屬性將會是:
The new cache attributes are:
• maxBytesOnHeap
• maxBytesOffHeap (formerly maxMemoryOffHeap)
• maxBytesOnDisk
甚至,還可以指定比例,如:maxBytesOnHeap="20%".
- 24.Ehcache可以將一些數(shù)據(jù)一直放到緩存或者堆?;蛘哂脖P或者terracotta的L2中。主要是為了滿足Hibernate等一些情況下的需求。但是,這樣很容易造成內(nèi)存溢出的錯誤
- 25.當緩存剛啟動時,ehcache提供一個機制可以先加載數(shù)據(jù):BootstrapCacheLoader
properties="bootstrapAsynchronously=true"/>
DiskStoreBootstrapCacheLoaderFactory:從硬盤加載數(shù)據(jù)到堆棧
properties="bootstrapAsynchronously=true"/>
TerracottaBootstrapCacheLoaderFactory:從terracotta的L2中加載數(shù)據(jù)
properties="bootstrapAsynchronously=true"/>
- 26.可以配置ehcache在讀或者寫的時候,做些事情。
CacheConfigurationconfig = new CacheConfiguration("copyCache",1000).copyOnRead(true)
Cache copyCache = newCache(config);
默認此屬性是false。
maxElementsInMemory="10"
eternal="false"
timeToIdleSeconds="5"
timeToLiveSeconds="10"
copyOnRead="true"
copyOnWrite="true">
com.company.ehcache.MyCopyStrategy"/>
- 27.每一個cache都有一個copyStrategy,所以,該實現(xiàn)是要求線程安全的
在ehcache啟動的時候,可以設置緩存失效。命令行啟動的時候如下:
java -Dnet.sf.ehcache.disabled=true
其他特殊的系統(tǒng)屬性:
1)java-Dnet.sf.ehcache.use.classic.lru=true
當LRU被選中的時候,更老的LruMemoryStore實現(xiàn)策略將會被真正采用
- 28.ehcache.xml必須遵守ehcache.xsd文件中的要求
- 29.當無參的構造函數(shù),或者靜態(tài)構造方法被調(diào)用的時候,系統(tǒng)會在最頂層的classpath路徑下找名叫ehcache.xml的配置文件,如果查找失敗,會以jar包中的ehcache-failsafe.xml文件(里邊的緩存配置極其簡單)替代。同時,一個警告會提醒用戶建立自己的配置文件。
- 30.Updatechecker可以檢查是否有最新的ehcache版本。有兩個辦法可以去掉該功能:
1)通過系統(tǒng)參數(shù):-Dnet.sf.ehcache.skipUpdateCheck=true
2)通過配置文件:
xsi:noNamespaceSchemaLocation="ehcache.xsd"
updateCheck="false"monitoring="autodetect"
dynamicConfig="true">
- 31.Ehcache1.6之前只支持ASCII編碼,之后,UTF-8也被支持。但UTF-8比ASCII更多落后,所以沒必要做專門的轉(zhuǎn)換
- 32.每一個Cachemanager應該有自己的獨有的ehcache.xml配置文件。因為,當共用時,硬盤緩存路徑或者監(jiān)聽端口將會沖突。系統(tǒng)也會發(fā)出警告,提醒用戶配置專門的配置文件為每一個cachemanager.在分布式系統(tǒng)中,ehcache.xml應該配置成一樣的。
- 33.Ehcache有3個存儲:
1)內(nèi)存存儲
2)非堆存儲(大內(nèi)存,企業(yè)ehcache才擁有)
3)硬盤存儲(兩個版本:開源的和企業(yè)級ehcache)
- 34.內(nèi)存存儲
其本質(zhì)是使用java的LinkedHashMap來實現(xiàn)的。多線程安全、內(nèi)存管理安全、速度快
- 35.calculateInMemorySize()可以用來計算當前ehcache內(nèi)存占用大小。但生產(chǎn)線上不應該使用,因為這個功能效率非常低
- 36.同時,ehcache內(nèi)部有一個低等級的進程,它會判斷元素的是否過期。diskExpiryThreadIntervalSeconds屬性可以設置該線程執(zhí)行的間隔時間(默認是120秒,不能太小,以免影響效率).
- 37.非堆存儲
Terracotta BigMemory是一個新增的功能,它允許系統(tǒng)占用堆以外的內(nèi)存,速度是硬盤存儲的100倍,允許很大的存儲空間被創(chuàng)建(350G被測試過)
因為非堆數(shù)據(jù)是以字節(jié)流的形式存儲,所以要求Element的key和value都要是可以序列化的。
因為序列化和反序列化的過程,這種存儲形式比內(nèi)存存儲慢10倍
- 38.硬盤存儲
線程安全的
- 39.當maxElementsOnDisk被設置的時候,硬盤上的存儲達到限制時,LFU算法會被執(zhí)行用于清除數(shù)據(jù),只能是該算法,不可配置
- 40.Persistence被設置成false或者omitted,當系統(tǒng)重啟時,不會硬盤的數(shù)據(jù)存儲在硬盤上,.data文件將會被刪除.相反,.data文件不會被刪除,下次重啟后Cachemanager還可以使用.data文件。
- 41.虛擬機被停止的時候,強烈建議調(diào)用Cachemanager.shutdown()方法。
- 42.在關閉java虛擬機時,系統(tǒng)執(zhí)行以下步驟:
Considerations for guidance on how to safely shut the VirtualMachine down.
When a DiskStore is persisted, the following steps take place:
On startup the following steps take place:
- 43.一個示范性地配置:
把一個擁有8G機器內(nèi)存的存儲分配成各種存儲。設想有一個7G的數(shù)據(jù)集,共7M個元素,每個元素1k大小。
我們設置1G的堆存儲和7G的非堆存儲:
java -Xms1G -Xmx1G -XX:maxDirectMemorySize=7G
對應的配置文件為:
maxElementsInMemory=100
overflowToOffHeap="true"(企業(yè))
maxMemoryOffHeap="7G"
... />
- 44.對于第二種集群方法,以下服務器被測試過:
• GlassfishV2/V3
• Tomcat 6
• Jetty 6
Tomcat6通過了所有的繼集成測試
支持Weblogic10.3.2,但是SOAP不兼容。
- 45.最大的Ehcache單實例在內(nèi)存中可以緩存20GB,最大的磁盤可以緩存100GB
- 46.關于ehcacheserver的相關命令用法在userguide的178頁
- 47.

緩存屬性:
緩存配置。
以下屬性是必須的:
name-cache的標識符,在一個CacheManager中必須唯一
maxElementsInMemory-在內(nèi)存中緩存的element的最大數(shù)目
maxElementsOnDisk-在磁盤上緩存的element的最大數(shù)目
eternal-設定緩存的elements是否有有效期。如果為true,timeouts屬性被忽略
overflowToDisk-設定當內(nèi)存緩存溢出的時候是否將過期的element緩存到磁盤上
以下屬性是可選的:
timeToIdleSeconds-緩存element在過期前的空閑時間。默認為0,表示可空閑無限時間.(如果指定了這個時間,是否在被hit的前超過了這個時間就會被remove?在內(nèi)存緩存數(shù)目超限之前不會被remove)
timeToLiveSeconds-緩存element的有效生命期。這個類似于timeouts,默認為0,不過期(是否通常情況下應該大于等于timeToIdleSeconds,小于會如何?idle時間也會減小和這個數(shù)值一樣)
diskPersistent-在VM重啟的時候是否持久化磁盤緩存,默認是false。
(測試一下true的情況?重載vm的時候會從磁盤進行序列化到對象)
diskExpiryThreadIntervalSeconds-磁盤緩存的清理線程運行間隔,默認是120秒.(測試一下0的時候會如何)
memoryStoreEvictionPolicy-當內(nèi)存緩存達到最大,有新的element加入的時候,移除緩存中element的策略。默認是LRU,可選的有LFU和FIFO可對緩存中的element配置諸如監(jiān)聽器和加載器。Ehcahe內(nèi)建了一些
*cacheEventListenerFactory-監(jiān)聽緩存中element的put,remove,update和expire事件
*bootstrapCacheLoaderFactory-啟動時加載緩存的element每個用來做分布式緩存都必須設定element的事件監(jiān)聽器,用來在各個CacheManager節(jié)點復制消息。
Ehcache內(nèi)建了基于RMI的實現(xiàn)-RMICacheReplicatorFactory
愛華網(wǎng)



