Ehcache詳解

1 cacheManager 的構(gòu)建


使用CacheManagerBuilder.newCacheManagerBuilder()靜態(tài)方法返回一個實例,且與一個Cache綁定
使用cacheManager.createCache()創(chuàng)建一個cache對象
remove移除cache,close釋放所有cahe對象

Spring + Ehcache的配置


利用注解注入

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


磁盤序列化方法CacheManagerBuilder.persistence()

注:如果您想使用持久化機制,就需要提供一個磁盤存儲的位置給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地址和端口號。


集群中的每個服務(wù)器都要配置自己的PeerProviderFactory




自動發(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配置文件中


設(shè)置providerFactory的properties


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ù)



?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、簡介 Ehcache是一個用Java實現(xiàn)的使用簡單,高速,實現(xiàn)線程安全的緩存管理類庫,ehcache提供了用內(nèi)...
    小程故事多閱讀 44,502評論 9 59
  • 理論總結(jié) 它要解決什么樣的問題? 數(shù)據(jù)的訪問、存取、計算太慢、太不穩(wěn)定、太消耗資源,同時,這樣的操作存在重復(fù)性。因...
    jiangmo閱讀 3,148評論 0 11
  • Ehcache是現(xiàn)在最流行的純Java開源緩存框架,配置簡單、結(jié)構(gòu)清晰、功能強大,最初知道它,是從Hibernat...
    安易學(xué)車閱讀 2,104評論 0 11
  • 原文連接:https://my.oschina.net/coolfire368/blog/123377 ehcac...
    晴天哥_王志閱讀 1,435評論 0 1
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,680評論 19 139

友情鏈接更多精彩內(nèi)容