Ehcache是一個(gè)開源、基于標(biāo)準(zhǔn)的緩存,可提升性能、減小數(shù)據(jù)庫負(fù)載、簡(jiǎn)化可擴(kuò)展性。是使用最廣泛的基于java的緩存,因?yàn)樗研浴⒔?jīng)過驗(yàn)證的、全特性、和與其他流行的庫和框架進(jìn)行整合。
Ehcache是一個(gè)純java的進(jìn)程內(nèi)緩存框架,具有快速、精干的特點(diǎn)。是hibernate默認(rèn)的cacheprovider。Ehcache是一種廣泛試用的java分布式緩存。主要面向通用緩存、jaVa ee和輕量級(jí)容器。具有內(nèi)存和磁盤存儲(chǔ),緩存加載器,緩存擴(kuò)展,緩存異常處理程序,一個(gè)gzip緩存servlet過濾器,支持REST和SOAP api等特點(diǎn)。
Spring提供了對(duì)緩存功能的抽象:及允許綁定不同的緩存解決方案(如ehcahce),但本身不提供緩存功能的實(shí)現(xiàn)。他支持注解方式使用緩存。
2、主要的特性有
1、快速
2、簡(jiǎn)單
3、多種緩存策略
4、緩存數(shù)據(jù)有兩級(jí):內(nèi)存和磁盤,因此無須擔(dān)心容量問題
5、緩存數(shù)據(jù)會(huì)在虛擬機(jī)重啟的過程中寫入磁盤
6、可通過RMI、可插入APi等方式進(jìn)行分布式緩存
7、具有緩存和緩存管理器的監(jiān)聽接口
8、支持多緩存管理器示例,以及一個(gè)實(shí)例的多個(gè)緩存區(qū)域
9、提供hibernate的緩存實(shí)現(xiàn)
3、集成
可以單獨(dú)使用,一般在第三方庫中被用到的較多,對(duì)分布式支持不夠好,多個(gè)節(jié)點(diǎn)不能同步,通常和redis一起使用。
4、ehcache和redis比較
ehcache直接在jvm虛擬機(jī)中緩存,速度快,效率高;但是緩存共享麻煩,集群分布式應(yīng)用不方便。
redis是通過socket訪問到緩存服務(wù)器,效率比ehcache低,比數(shù)據(jù)庫快。處理集群和分布式緩存方便,有成熟的方案。如果單個(gè)應(yīng)用對(duì)緩存訪問要求高可用ehcache,如果是大型系統(tǒng),存在緩存共享、分布式部署、緩存內(nèi)容大,建議用redis。
ehcache也有緩存共享方案,不過是通過RMI或者Jgroup多播方式進(jìn)行廣播緩存通知更新,緩存共享復(fù)雜,維護(hù)不方便;簡(jiǎn)單的共享可以,但涉及緩存恢復(fù)、大數(shù)據(jù)緩存,則不適合。
5、getting start
開始使用Ehcache,需要先配置cache manager和cache,可通過編程的方式和xml的方式進(jìn)行配置。
編程方式配置
cachemanager 管理cache
acheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder() .withCache("preConfigured", CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(10)));
Cache preConfigured = cacheManager.getCache("preConfigured", Long.class, String.class);
XML配置
<config>
<cache alias="foo">//別名foo
<key-type>java.lang.String</key-type>//指定建類型,若不指定則是Object類型
<value-type>java.lang.String</value-type>//指定值類型,若不指定則是Object類型
<resource>
<heap unite="entries">2000</heap>
<offheap unit-"mb">600</offheap>
</resource>
</cache>
<cache-template name="myDefault">//cache模版,可被繼承使用
<key-type>java.lang.Long</key-type>
<value-type>java.lang.String</value-type>
<heap unit="entries">200</heap>
</cache-template>
<cache alias="bar" uses-template="myDefault">//繼承myDefault模版,并覆蓋key類型
<key-type>java.lang.Number</key-type>
</cache>
</config>
Ehcache 層次緩存選項(xiàng)
ehcache支持基于層的緩存。
移出堆內(nèi)存:
1、當(dāng)添加一個(gè)映射到緩存,需要將key和value序列化2、當(dāng)讀取一個(gè)映射,需要將key和value反序列化。
序列化和反序列化影響緩存性能
單一層設(shè)置
ehcahce所有的層可單獨(dú)配置,有
heap堆內(nèi)存,最快的層,不須經(jīng)過序列化和反序列化
offheap對(duì)外內(nèi)存,移出heap需經(jīng)序列化和反序列化,較heap要滿
disk磁盤,持久化,在jvm重啟時(shí)緩存會(huì)保留下來
clustered集群,需Terracotta Server Array?
多層同時(shí)配置,需注意
1、多層配置時(shí),必需有heap層
2、disk和clustered不能同時(shí)配置
3、各層應(yīng)使用金字塔是配置,即下層存儲(chǔ)要大于上層的存儲(chǔ)空間
資源池
一般使用ResourcePoolBuilder,資源池只是制定配置,不是實(shí)際的一個(gè)可被緩存使用的池。
更新資源池,可在正被使用的cache上對(duì)資源池的配置進(jìn)行修改,但可修改是有限的
銷毀持久層,PersistentCacheManager.destroy()方法
多層緩存操作中的序列化流
當(dāng)put一個(gè)值到cache,直接會(huì)存到author層,最底層
get操作會(huì)把值推到cacheing層
只要值被put到author層,全部的高層都置無效
全部訪問未命中都會(huì)訪問到author層為止
創(chuàng)建集群支持的緩存管理
1、啟用?Terracotta服務(wù),配置集群存儲(chǔ)
因?yàn)閑hcache對(duì)于分布式共享并不是很好的支持,故不詳細(xì)說明,與redis結(jié)合是更好的方式。