1 cacheManager 的構(gòu)建



Spring + Ehcache的配置

在Spring項目中只要注入cacheManager即可。

注:如果您想使用持久化機制,就需要提供一個磁盤存儲的位置給CacheManagerBuilder.persistence這個方法,另外在使用的過程中,你還需要定義一個磁盤使用的資源池。
Ehcache集群簡介
從Ehcache1.2版本開始,Ehcache就可以使用分布式的緩存了,從 1.7版本開始,開始支持共五種集群方案,分別是:
Terracotta
RMI
JMS
JGroups
EhCache Server
其中有三種上最為常用集群方式,分別是 RMI、JGroups 以及 EhCache Server 。
其實我們在使用Ehcache分布式緩存的過程中,主要是以緩存插件的方式使用,如果我們想根據(jù)自己的需要使用分布式緩存那就需要自己開發(fā)來定制化,在后面我們會發(fā)現(xiàn)其實Ehcache提供的分布式緩存并不是非常好用,有不少問題存在,所以對緩存數(shù)據(jù)一致性比較高的情況下,使用集中式緩存更合適,比如Redis、Memcached等。
Ehcache集群的基本概念
1 成員發(fā)現(xiàn)(Peer Discovery)
Ehcache集群概念中有一個cache組,每個cache都是另一個cache的peer,并不像Redis或者其他分布式組件一樣有一個主的存在,Ehcache并沒有主Cache,可是那如何知道集群中的其他緩存都有誰呢?這個就是成員發(fā)現(xiàn)。
Ehcache提供了二種機制來實現(xiàn)成員發(fā)現(xiàn)功能,分別是手動發(fā)現(xiàn)和自動發(fā)現(xiàn)。
手動發(fā)現(xiàn)
在Ehcache的配置文件中指定cacheManagerPeerProviderFactory元素的class屬性為net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory。這就需要自己去配置IP地址和端口號。

自動發(fā)現(xiàn)
自動的發(fā)現(xiàn)方式用TCP廣播機制來確定和維持一個廣播組。它只需要一個簡單的配置可以自動的在組中添加和移除成員。在集群中也不需要什么優(yōu)化服務(wù)器的知識,這是默認推薦的。
成員每秒向群組發(fā)送一個“心跳”。如果一個成員 5秒種都沒有發(fā)出信號它將被群組移除。如果一個新的成員發(fā)送了一個“心跳”它將被添加進群組。
任何一個用這個配置安裝了復(fù)制功能的cache都將被其他的成員發(fā)現(xiàn)并標識為可用狀態(tài)。
要設(shè)置自動的成員發(fā)現(xiàn),需要指定ehcache配置文件中

Spring配置

對每個需要同步的cache配置<cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"/>
CacheReplicators
每個要進行同步的cache都需要設(shè)置一個用來向CacheManager的成員復(fù)制消息的緩存事件監(jiān)聽器。這個工作要通過為每個cache的配置增加一個cacheEventListenerFactory元素來完成。
RMI集群的原理:當(dāng)緩存改變時,ehcache會向組播IP地址和端口號發(fā)送RMI UDP組播包。
缺陷:Ehcache的組播做得比較初級,功能只是基本實現(xiàn)(比如簡單的一個HUB,接兩臺單網(wǎng)卡的服務(wù)器,互相之間組播同步就沒問題),對一些復(fù)雜的環(huán)境(比如多臺服務(wù)器,每臺服務(wù)器上多地址,尤其是集群,存在一個集群地址帶多個物理機,每臺物理機又帶多個虛擬站的子地址),就容易出現(xiàn)問題。
11.3、使用Ehcache的瓶頸是什么
1、緩存漂移(Cache Drift):每個應(yīng)用節(jié)點只管理自己的緩存,在更新某個節(jié)點的時候,不會影響到其他的節(jié)點,這樣數(shù)據(jù)之間可能就不同步了。
2、數(shù)據(jù)庫瓶頸(Database Bottlenecks ):對于單實例的應(yīng)用來說,緩存可以保護數(shù)據(jù)庫的讀風(fēng)暴;但是,在集群的環(huán)境下,每一個應(yīng)用節(jié)點都要定期保持數(shù)據(jù)最新,節(jié)點越多,要維持這樣的情況對數(shù)據(jù)庫的開銷也越大。
11.4、實際工作中如何使用Ehcache
在實際工作中,我更多是將Ehcache作為與Redis配合的二級緩存。
第一種方式:

注:這種方式通過應(yīng)用服務(wù)器的Ehcache定時輪詢Redis緩存服務(wù)器更同步更新本地緩存,缺點是因為每臺服務(wù)器定時Ehcache的時間不一樣,那么不同服務(wù)器刷新最新緩存的時間也不一樣,會產(chǎn)生數(shù)據(jù)不一致問題,對一致性要求不高可以使用。
第二種方式:

注:
通過引入了MQ隊列,使每臺應(yīng)用服務(wù)器的Ehcache同步偵聽MQ消息,這樣在一定程度上可以達到準同步更新數(shù)據(jù),通過MQ推送或者拉取的方式,但是因為不同服務(wù)器之間的網(wǎng)絡(luò)速度的原因,所以也不能完全達到強一致性?;诖嗽硎褂肸ookeeper等分布式協(xié)調(diào)通知組件也是如此。
總結(jié):
1、使用二級緩存的好處是減少緩存數(shù)據(jù)的網(wǎng)絡(luò)傳輸開銷,當(dāng)集中式緩存出現(xiàn)故障的時候,Ehcache等本地緩存依然能夠支撐應(yīng)用程序正常使用,增加了程序的健壯性。另外使用二級緩存策略可以在一定程度上阻止緩存穿透問題。
源碼分析


Ehcahe存放內(nèi)存是經(jīng)過如下幾步:
1.put一個數(shù)據(jù)進memoryStore
2.checkCapacit容量
3.如果達到上限則啟用淘汰策略
4.查找淘汰策略
5.選擇合適的淘汰算法
6.返回節(jié)點數(shù)據(jù)