EhCache 分佈式緩存/緩存集羣

開發環境:

System:Windows

JavaEE Server:tomcat5.0.2.8、tomcat6

JavaSDK: jdk6+

IDE:eclipse、MyEclipse 6.6

開發依賴庫:

JDK6、 JavaEE5、ehcache-core-2.5.2.jar

Email:[email protected]

Blog:http://blog.csdn.net/IBM_hoojo

http://hoojo.cnblogs.com/

http://hoojo.blogjava.net

前面2篇文章介紹到Ehcache 整合Spring 使用頁面、對象緩存http://www.cnblogs.com/hoojo/archive/2012/07/12/2587556.html 

在Spring、Hibernate中使用Ehcache緩存 http://www.cnblogs.com/hoojo/archive/2012/07/12/2587941.html

一、緩存系統簡介

EhCache 是一個純 Java 的進程內緩存框架,具有快速、精幹等特點,是 Hibernate 中默認的 CacheProvider。

EhCache 應用架構圖,下圖是 EhCache 在應用程序中的位置:

EhCache 分佈式緩存/緩存集羣

EhCache 的主要特性有:

1. 快速、精幹;

2. 簡單;

3. 多種緩存策略;

4. 緩存數據有兩級:內存和磁盤,因此無需擔心容量問題;

5. 緩存數據會在虛擬機重啓的過程中寫入磁盤;

6. 可以通過 RMI、可插入 API 等方式進行分佈式緩存;

7. 具有緩存和緩存管理器的偵聽接口;

8. 支持多緩存管理器實例,以及一個實例的多個緩存區域;

9. 提供 Hibernate 的緩存實現;

由 於 EhCache 是進程中的緩存系統,一旦將應用部署在集羣環境中,每一個節點維護各自的緩存數據,當某個節點對緩存數據進行更新,這些更新的數據無法在其它節點中共享, 這不僅會降低節點運行的效率,而且會導致數據不同步的情況發生。例如某個網站採用 A、B 兩個節點作爲集羣部署,當 A 節點的緩存更新後,而 B 節點緩存尚未更新就可能出現用戶在瀏覽頁面的時候,一會是更新後的數據,一會是尚未更新的數據,儘管我們也可以通過 Session Sticky 技術來將用戶鎖定在某個節點上,但對於一些交互性比較強或者是非 Web 方式的系統來說,Session Sticky 顯然不太適合。

所以就需要用到 EhCache 的集羣解決方案。

從1.2版本開始,Ehcache可以使用分佈式的緩存了。EhCache 從 1.7 版本開始,支持五種集羣方案,分別是:

• Terracotta

• RMI

• JMS

• JGroups

• EhCache Server

其中的三種最爲常用集羣方式,分別是 RMI、JGroups 以及 EhCache Server 。本文主要介紹RMI的方式。

分 布式這個特性是以plugin的方式實現的。Ehcache自帶了一些默認的分佈式緩存插件實現,這些插件可以滿足大部分應用的需要。如果需要使用其他的 插件那就需要自己開發了,開發者可以通過查看distribution包裏的源代碼及JavaDoc來實現它。儘管不是必須的,在使用分佈式緩存時理解一 些ehcahce的設計思想也是有幫助的。這可以參看分佈式緩存設計的頁面。以下的部分將展示如何讓分佈式插件同ehcache一起工作。

下面列出的是一些分佈式緩存中比較重要的方面:

• 你如何知道集羣環境中的其他緩存?

• 分佈式傳送的消息是什麼形式?

• 什麼情況需要進行復制?增加(Puts),更新(Updates)或是失效(Expiries)?

• 採用什麼方式進行復制?同步還是異步方式?

爲了安裝分佈式緩存,你需要配置一個PeerProvider、一個CacheManagerPeerListener,

它們對於一個CacheManager來說是全局的。每個進行分佈式操作的cache都要添加一個cacheEventListener來傳送消息。

二、集羣緩存概念及其配置

正確的元素類型

只有可序列化的元素可以進行復制。一些操作,比如移除,只需要元素的鍵值而不用整個元素;在這樣的操作中即使元素不是可序列化的但鍵值是可序列化的也可以被複制。

成員發現(Peer Discovery)

Ehcache進行集羣的時候有一個cache組的概念。每個cache都是其他cache的一個peer,沒有主cache的存在。剛纔我們問了一個問題:你如何知道集羣環境中的其他緩存?這個問題可以命名爲成員發現(Peer Discovery)。

Ehcache提供了兩種機制用來進行成員發現,就像一輛汽車:手動檔和自動檔。要使用一個內置的成員發現機制要在ehcache的配置文件中指定cacheManagerPeerProviderFactory元素的class屬性爲

net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory。

自動的成員發現

自動的發現方式用TCP廣播機制來確定和維持一個廣播組。它只需要一個簡單的配置可以自動的在組中添加和移除成員。在集羣中也不需要什麼優化服務器的知識,這是默認推薦的。

成員每秒向羣組發送一個“心跳”。如果一個成員 5秒種都沒有發出信號它將被羣組移除。如果一個新的成員發送了一個“心跳”它將被添加進羣組。

任何一個用這個配置安裝了複製功能的cache都將被其他的成員發現並標識爲可用狀態。

要設置自動的成員發現,需要指定ehcache配置文件中cacheManagerPeerProviderFactory元素的properties屬性,就像下面這樣:
peerDiscovery=automatic

multicastGroupAddress=multicast address | multicast host name

multicastGroupPort=port

timeToLive=0-255 (timeToLive屬性詳見常見問題部分的描述)

示例

假設你在集羣中有兩臺服務器。你希望同步sampleCache1和sampleCache2。每臺獨立的服務器都要有這樣的配置:
配置server1和server2

<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1,
multicastGroupPort=4446, timeToLive=32"/>

手動進行成員發現

進行手動成員配置要知道每個監聽器的IP地址和端口。成員不能在運行時動態地添加和移除。在技術上很難使用廣播的情況下就可以手動成員發現,例如在 集羣的服務器之間有一個不能傳送廣播報文的路由器。你也可以用手動成員發現進行單向的數據複製,只讓server2知道server1,而server1 不知道server2。

配置手動成員發現,需要指定ehcache配置文件中cacheManagerPeerProviderFactory的properties屬性,像下面這樣:
peerDiscovery=manual rmiUrls=//server:port/cacheName, //server:port/cacheName ...
rmiUrls配置的是服務器cache peers的列表。注意不要重複配置。

示例

假設你在集羣中有兩臺服務器。你要同步sampleCache1和sampleCache2。下面是每個服務器需要的配置:
配置server1

<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=manual,
rmiUrls=//server2:40001/sampleCache11|//server2:40001/sampleCache12"/>

配置server2

<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=manual,
rmiUrls=//server1:40001/sampleCache11|//server1:40001/sampleCache12"/>

配置CacheManagerPeerListener

每個CacheManagerPeerListener監聽從成員們發向當前CacheManager的消息。配置 CacheManagerPeerListener需要指定一個CacheManagerPeerListenerFactory,它以插件的機制實現, 用來創建CacheManagerPeerListener。

cacheManagerPeerListenerFactory的屬性有:
class – 一個完整的工廠類名。
properties – 只對這個工廠有意義的屬性,使用逗號分隔。

Ehcache有一個內置的基於RMI的分佈系統。它的監聽器是RMICacheManagerPeerListener,這個監聽器可以用

RMICacheManagerPeerListenerFactory來配置。

<cacheManagerPeerListenerFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
properties="hostName=localhost, port=40001,
socketTimeoutMillis=2000"/>

有效的屬性是:
hostname (可選) – 運行監聽器的服務器名稱。標明瞭做爲集羣羣組的成員的地址,同時也是你想要控制的從集羣中接收消息的接口。

在CacheManager初始化的時候會檢查hostname是否可用。

如果hostName不可用,CacheManager將拒絕啓動並拋出一個連接被拒絕的異常。

如果指定,hostname將使用InetAddress.getLocalHost().getHostAddress()來得到。

警告:不要將localhost配置爲本地地址127.0.0.1,因爲它在網絡中不可見將會導致不能從遠程服務器接收信息從而不能複製。在同一臺機器上有多個CacheManager的時候,你應該只用localhost來配置。

port – 監聽器監聽的端口。
socketTimeoutMillis (可選) – Socket超時的時間。默認是2000ms。當你socket同步緩存請求地址比較遠,不是本地局域網。你可能需要把這個時間配置大些,不然很可能延時導致同步緩存失敗。

配置CacheReplicators

每個要進行同步的cache都需要設置一個用來向CacheManagerr的成員複製消息的緩存事件監聽器。這個工作要通過爲每個cache的配置增加一個cacheEventListenerFactory元素來完成。

<!-- Sample cache named sampleCache2. -->
<cache name="sampleCache2"
maxElementsInMemory="10"
eternal="false"
timeToIdleSeconds="100"
timeToLiveSeconds="100"
overflowToDisk="false">
<cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
properties="replicateAsynchronously=true,replicatePuts=true, replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true "/>
</cache>

class – 使用net.sf.ehcache.distribution.RMICacheReplicatorFactory

這個工廠支持以下屬性:
replicatePuts=true | false – 當一個新元素增加到緩存中的時候是否要複製到其他的peers. 默認是true。
replicateUpdates=true | false – 當一個已經在緩存中存在的元素被覆蓋時是否要進行復制。默認是true。
replicateRemovals= true | false – 當元素移除的時候是否進行復制。默認是true。
replicateAsynchronously=true | false – 複製方式是異步的(指定爲true時)還是同步的(指定爲false時)。默認是true。
replicatePutsViaCopy=true | false – 當一個新增元素被拷貝到其他的cache中時是否進行復制指定爲true時爲複製,默認是true。
replicateUpdatesViaCopy=true | false – 當一個元素被拷貝到其他的cache中時是否進行復制(指定爲true時爲複製),默認是true。

你可以使用ehcache的默認行爲從而減少配置的工作量,默認的行爲是以異步的方式複製每件事;你可以像下面的例子一樣減少RMICacheReplicatorFactory的屬性配置:

<!-- Sample cache named sampleCache4. All missing RMICacheReplicatorFactory properties default to true -->
<cache name="sampleCache4"
maxElementsInMemory="10"
eternal="true"
overflowToDisk="false"
memoryStoreEvictionPolicy="LFU">
<cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"/>
</cache>

 

常見的問題

Windows上的Tomcat

有一個Tomcat或者是JDK的bug,在tomcat啓動時如果tomcat的安裝路徑中有空格的話,在啓動時RMI監聽器會失敗。參見 http://archives.java.sun.com/cgi-bin/wa?A2=ind0205&L=rmi-users& P=797和http://www.ontotext.com/kim/doc/sys-doc/faq-howto-bugs/known-bugs.html

由於在Windows上安裝Tomcat默認是裝在“Program Files”文件夾裏的,所以這個問題經常發生。

廣播阻斷

自動的peer discovery與廣播息息相關。廣播可能被路由阻攔,像Xen和VMWare這種虛擬化的技術也可以阻攔廣播。如果這些都打開了,你可能還在要將你的網卡的相關配置打開。一個簡單的辦法可以告訴廣播是否有效,

那就是使用ehcache remote debugger來看“心跳”是否可用。

廣播傳播的不夠遠或是傳得太遠

你可以通過設置badly misnamed time to live來控制廣播傳播的距離。用廣播IP協議時,timeToLive的值指的是數據包可以傳遞的域或是範圍。約定如下:

0是限制在同一個服務器

1是限制在同一個子網

32是限制在同一個網站

64是限制在同一個region

128是限制在同一個大洲

255是不限制

譯者按:上面這些資料翻譯的不夠準確,請讀者自行尋找原文理解吧。

在Java實現中默認值是1,也就是在同一個子網中傳播。改變timeToLive屬性可以限制或是擴展傳播的範圍。

 

三、 RMI方式緩存集羣/配置分佈式緩存

RMI 是 Java 的一種遠程方法調用技術,是一種點對點的基於 Java 對象的通訊方式。EhCache 從 1.2 版本開始就支持 RMI 方式的緩存集羣。在集羣環境中 EhCache 所有緩存對象的鍵和值都必須是可序列化的,也就是必須實現 java.io.Serializable 接口,這點在其它集羣方式下也是需要遵守的。

     下圖是 RMI 集羣模式的結構圖:

      EhCache 分佈式緩存/緩存集羣

採用 RMI 集羣模式時,集羣中的每個節點都是對等關係,並不存在主節點或者從節點的概念,因此節點間必須有一個機制能夠互相認識對方,必須知道其它節點的信息,包括 主機地址、端口號等。EhCache 提供兩種節點的發現方式:手工配置和自動發現。手工配置方式要求在每個節點中配置其它所有節點的連接信息,一旦集羣中的節點發生變化時,需要對緩存進行重 新配置。

由於 RMI 是 Java 中內置支持的技術,因此使用 RMI 集羣模式時,無需引入其它的 Jar 包,EhCache 本身就帶有支持 RMI 集羣的功能。使用 RMI 集羣模式需要在 ehcache.xml 配置文件中定義 cacheManagerPeerProviderFactory 節點。

      分佈式同步緩存要讓這邊的cache知道對方的cache,叫做Peer Discovery(成員發現) EHCache實現成員發現的方式有兩種:

1、手動查找

A、 在ehcache.xml中配置PeerDiscovery成員發現對象

      Server1配置,配置本地hostName、port是400001,分別監聽192.168.8.32:400002的mobileCache和 192.168.5.231:400003 的mobileCache。注意這裏的mobileCache是緩存的名稱,分別對應着server2、server3的cache的配置。

<?xml version="1.0" encoding="gbk"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">
    <diskStore path="java.io.tmpdir"/>
 
    <!-- 
        集羣多臺服務器中的緩存,這裏是要同步一些服務器的緩存
        server1 hostName:192.168.8.9 port:400001 cacheName:mobileCache
        server2 hostName:192.168.8.32 port:400002 cacheName:mobileCache
        server3 hostName:192.168.8.231 port:400003 cacheName:mobileCache
        注意:每臺要同步緩存的服務器的RMI通信socket端口都不一樣,在配置的時候注意設置
    -->
    
    <!-- server1 的cacheManagerPeerProviderFactory配置 -->
    <cacheManagerPeerProviderFactory 
        class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" 
        properties="hostName=localhost,
        port=400001,
        socketTimeoutMillis=2000,
        peerDiscovery=manual,
        rmiUrls=//192.168.8.32:400002/mobileCache|//192.168.5.231:400003/mobileCache"
    />
</ehcache>

以上注意cacheManagerPeerProviderFactory元素出現的位置在diskStore下

同樣在你的另外2臺服務器上增加配置

Server2,配置本地host,port爲400002,分別同步192.168.8.9:400001的mobileCache和192.168.5.231:400003的mobileCache

<!-- server2 的cacheManagerPeerProviderFactory配置 -->
<cacheManagerPeerProviderFactory 
    class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" 
    properties="hostName=localhost,
    port=400002,
    socketTimeoutMillis=2000,
    peerDiscovery=manual,
    rmiUrls=//192.168.8.9:400001/mobileCache|//192.168.5.231:400003/mobileCache"
/>

Server3,配置本地host,port爲400003,分別同步192.168.8.9:400001的mobileCache緩存和192.168.8.32:400002的mobileCache緩存

<!-- server3 的cacheManagerPeerProviderFactory配置 -->
<cacheManagerPeerProviderFactory 
    class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" 
    properties="hostName=localhost,
    port=400003,
    socketTimeoutMillis=2000,
    peerDiscovery=manual,
    rmiUrls=//192.168.8.9:400001/mobileCache|//192.168.8.32:400002/mobileCache"
/>

這樣就在三臺不同的服務器上配置了手動查找cache的PeerProvider成員發現的配置了。 值得注意的是你在配置rmiUrls的時候要特別注意url不能重複出現,並且端口、地址都是對的。

如果指定,hostname將使用InetAddress.getLocalHost().getHostAddress()來得到。

警告:不要將localhost配置爲本地地址127.0.0.1,因爲它在網絡中不可見將會導致不能從遠程服務器接收信息從而不能複製。在同一臺機器上有多個CacheManager的時候,你應該只用localhost來配置。

B、 下面配置緩存和緩存同步監聽,需要在每臺服務器中的ehcache.xml文件中增加cache配置和cacheEventListenerFactory、cacheLoaderFactory的配置

<defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="30" timeToLiveSeconds="30" overflowToDisk="false"/>
<!-- 
    配置自定義緩存
    maxElementsInMemory:緩存中允許創建的最大對象數
    eternal:緩存中對象是否爲永久的,如果是,超時設置將被忽略,對象從不過期。
    timeToIdleSeconds:緩存數據空閒的最大時間,也就是說如果有一個緩存有多久沒有被訪問就會被銷燬,如果該值是 0 就意味着元素可以停頓無窮長的時間。
    timeToLiveSeconds:緩存數據存活的時間,緩存對象最大的的存活時間,超過這個時間就會被銷燬,這只能在元素不是永久駐留時有效,如果該值是0就意味着元素可以停頓無窮長的時間。
    overflowToDisk:內存不足時,是否啓用磁盤緩存。
    memoryStoreEvictionPolicy:緩存滿了之後的淘汰算法。
    
    每一個小時更新一次緩存(1小時過期) 
-->
<cache name="mobileCache"
    maxElementsInMemory="10000"
    eternal="false"
    overflowToDisk="true"
    timeToIdleSeconds="1800"
    timeToLiveSeconds="3600"
    memoryStoreEvictionPolicy="LFU">
    <!-- 
        RMI緩存分佈同步查找 class使用net.sf.ehcache.distribution.RMICacheReplicatorFactory
        這個工廠支持以下屬性:
        replicatePuts=true | false – 當一個新元素增加到緩存中的時候是否要複製到其他的peers。默認是true。
        replicateUpdates=true | false – 當一個已經在緩存中存在的元素被覆蓋時是否要進行復制。默認是true。
        replicateRemovals= true | false – 當元素移除的時候是否進行復制。默認是true。
        replicateAsynchronously=true | false – 複製方式是異步的指定爲true時,還是同步的,指定爲false時。默認是true。
        replicatePutsViaCopy=true | false – 當一個新增元素被拷貝到其他的cache中時是否進行復制指定爲true時爲複製,默認是true。
        replicateUpdatesViaCopy=true | false – 當一個元素被拷貝到其他的cache中時是否進行復制指定爲true時爲複製,默認是true。
            asynchronousReplicationIntervalMillis=1000
        -->
    <!-- 監聽RMI同步緩存對象配置 註冊相應的的緩存監聽類,用於處理緩存事件,如put,remove,update,和expire -->
    <cacheEventListenerFactory
        class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
        properties="replicateAsynchronously=true, 
        replicatePuts=true, 
        replicateUpdates=true,
        replicateUpdatesViaCopy=false, 
        replicateRemovals=true "/>
    <!-- 用於在初始化緩存,以及自動設置 -->
    <bootstrapCacheLoaderFactory class="net.sf.ehcache.bootstrap.BootstrapCacheLoaderFactory"/>
</cache>

C、 這樣就完成了3臺服務器的配置,下面給出server1的完整的ehcache.xml的配置

<?xml version="1.0" encoding="gbk"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">
    <diskStore path="java.io.tmpdir"/>
 
    <!-- 
        集羣多臺服務器中的緩存,這裏是要同步一些服務器的緩存
        server1 hostName:192.168.8.9 port:400001 cacheName:mobileCache
        server2 hostName:192.168.8.32 port:400002 cacheName:mobileCache
        server3 hostName:192.168.8.231 port:400003 cacheName:mobileCache
        注意每臺要同步緩存的服務器的RMI通信socket端口都不一樣,在配置的時候注意設置
    -->
    
    <!-- server1 的cacheManagerPeerProviderFactory配置 -->
    <cacheManagerPeerProviderFactory 
        class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" 
        properties="hostName=localhost,
        port=400001,
        socketTimeoutMillis=2000,
        peerDiscovery=manual,
        rmiUrls=//192.168.8.32:400002/mobileCache|//192.168.5.231:400003/mobileCache"
    />
    
    <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="30" timeToLiveSeconds="30" overflowToDisk="false"/>
    <!-- 
        配置自定義緩存
        maxElementsInMemory:緩存中允許創建的最大對象數
        eternal:緩存中對象是否爲永久的,如果是,超時設置將被忽略,對象從不過期。
        timeToIdleSeconds:緩存數據空閒的最大時間,也就是說如果有一個緩存有多久沒有被訪問就會被銷燬,
                    如果該值是 0 就意味着元素可以停頓無窮長的時間。
        timeToLiveSeconds:緩存數據存活的時間,緩存對象最大的的存活時間,超過這個時間就會被銷燬,
                    這只能在元素不是永久駐留時有效,如果該值是0就意味着元素可以停頓無窮長的時間。
        overflowToDisk:內存不足時,是否啓用磁盤緩存。
        memoryStoreEvictionPolicy:緩存滿了之後的淘汰算法。
        
        每一個小時更新一次緩存(1小時過期) 
    -->
    <cache name="mobileCache"
        maxElementsInMemory="10000"
        eternal="false"
        overflowToDisk="true"
        timeToIdleSeconds="1800"
        timeToLiveSeconds="3600"
        memoryStoreEvictionPolicy="LFU">
        <!-- 
            RMI緩存分佈同步查找 class使用net.sf.ehcache.distribution.RMICacheReplicatorFactory
            這個工廠支持以下屬性:
            replicatePuts=true | false – 當一個新元素增加到緩存中的時候是否要複製到其他的peers。默認是true。
            replicateUpdates=true | false – 當一個已經在緩存中存在的元素被覆蓋時是否要進行復制。默認是true。
            replicateRemovals= true | false – 當元素移除的時候是否進行復制。默認是true。
            replicateAsynchronously=true | false – 複製方式是異步的指定爲true時,還是同步的,指定爲false時。默認是true。
            replicatePutsViaCopy=true | false – 當一個新增元素被拷貝到其他的cache中時是否進行復制指定爲true時爲複製,默認是true。
            replicateUpdatesViaCopy=true | false – 當一個元素被拷貝到其他的cache中時是否進行復制指定爲true時爲複製,默認是true。
                asynchronousReplicationIntervalMillis=1000
            -->
        <!-- 監聽RMI同步緩存對象配置 註冊相應的的緩存監聽類,用於處理緩存事件,如put,remove,update,和expire -->
        <cacheEventListenerFactory
            class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
            properties="replicateAsynchronously=true, 
            replicatePuts=true, 
            replicateUpdates=true,
            replicateUpdatesViaCopy=false, 
            replicateRemovals=true "/>
        <!-- 用於在初始化緩存,以及自動設置 -->
        <bootstrapCacheLoaderFactory class="net.sf.ehcache.bootstrap.BootstrapCacheLoaderFactory"/>
    </cache>
</ehcache>

2、自動發現

自動發現配置和手動查找的方式有一點不同,其他的地方都基本是一樣的。同樣在ehcache.xml中增加配置,配置如下

<!--
搜索某個網段上的緩存
timeToLive
    0是限制在同一個服務器
    1是限制在同一個子網
    32是限制在同一個網站
    64是限制在同一個region
    128是限制在同一個大洲
    255是不限制
-->
<cacheManagerPeerProviderFactory
    class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
    properties="peerDiscovery=automatic, multicastGroupAddress=192.168.0.1,
    multicastGroupPort=400004, timeToLive=32"
/>

其他的配置和手動查找方式的配置是一樣的,這裏就不再贅述了。關於ehcache的其他緩存配置方式這裏將不再介紹,大家可以自己去研究。可以參考:

官方文檔:http://www.ehcache.org/documentation/user-guide/cache-topologies#using-a-cache-server

ibm developerworks文檔:http://www.ibm.com/developerworks/cn/java/j-lo-ehcache/index.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章