1. 程式人生 > >Ehcache 分散式快取

Ehcache 分散式快取

自從Ehcache 到了1.2+的版本,就支援分散式快取了。我們考慮到Spring + Hibernate的結構 ,ehcache的對這幾個框架的支援較好,就一直採用這個快取方案。
地址:http://ehcache.sourceforge.net/

先介紹沒有分散式快取需求的配置:
1.先下載ehcache的jar包。download
最新版本 11 June 2007: ehcache-1.3 released。
解壓後,有幾個檔案:
ehcache-1.3.0.jar:需要將它放置到WEB-INF/lib下
ehcache-1.3.0-remote-debugger.jar:不要釋出到你的工程中,是用來除錯和監控你的cache狀況的
ehcache-1.3.0-sources.jar:原始碼
ehcache.xml :重要的配置檔案,需要複製到classpath下 。
2.ehcach.xml配置檔案主要引數的解釋,其實檔案裡有詳細的英文註釋


//DiskStore 配置,cache檔案的存放目錄 ,主要的值有
*user.home - 使用者主目錄
* user.dir - 使用者當前的工作目錄
* java.io.tmpdir - Default temp file path預設的temp檔案目錄

//強制預設的cache配置

<defaultCachemaxElementsInMemory="10000"eternal="false"timeToIdleSeconds="120"timeToLiveSeconds="120"overflowToDisk="true"diskSpoolBufferSizeMB="30"maxElementsOnDisk

="10000000"diskPersistent="false"diskExpiryThreadIntervalSeconds="120"memoryStoreEvictionPolicy="LRU"/>

必須屬性:
name:設定快取的名稱,用於標誌快取,惟一
maxElementsInMemory:在記憶體中最大的物件數量
maxElementsOnDisk:在DiskStore中的最大物件數量,如為0,則沒有限制
eternal:設定元素是否永久的,如果為永久,則timeout忽略
overflowToDisk:是否當memory中的數量達到限制後,儲存到Disk

可選的屬性:
timeToIdleSeconds:設定元素過期前的空閒時間
timeToLiveSeconds:設定元素過期前的活動時間
diskPersistent:是否disk store在虛擬機器啟動時持久化。預設為false
diskExpiryThreadIntervalSeconds:執行disk終結執行緒的時間,預設為120秒
memoryStoreEvictionPolicy:策略關於Eviction

快取子元素:
cacheEventListenerFactory:註冊相應的的快取監聽類,用於處理快取事件,如put,remove,update,和expire
bootstrapCacheLoaderFactory:指定相應的BootstrapCacheLoader,用於在初始化快取,以及自動設定。

3.分散式快取配置方法 是基於RMI方式的
在cache.xml(ehcache的配置檔案)中加入

<cacheManagerPeerProviderFactoryclass="net.sf.ehcache.distribution
.RMICacheManagerPeerProviderFactory
"properties="peerDiscovery=automatic, 
multicastGroupAddress=230.0.0.1, multicastGroupPort=4446
"/><cacheManagerPeerListenerFactoryclass="net.sf.ehcache.distribution.
RMICacheManagerPeerListenerFactory
"/>

//自動查詢區域網中分散式的peer 。也可以手工指定節點的地址的,如:
peerDiscovery=manual,rmiUrls=//server1:40000/sampleCache1

另外在每個cache屬性中加入

<cacheEventListenerFactoryclass="net.sf.ehcache.distribution.
RMICacheReplicatorFactory
"/>

例如:

1. <cache name="a"

2.      maxElementsInMemory="10000"

3.      eternal="true"

4.      overflowToDisk="true">

5.      <cacheEventListenerFactory

6. class="net.sf.ehcache.distribution.

7. RMICacheReplicatorFactory"/>

8. </cache>

ehcache提供三種網路連線策略來實現叢集,rmi,jgroup還有jms。同時ehcache可以可以實現多播的方式實現叢集,也可以手動指定叢集主機序列實現叢集。

Ehcache支援的分散式快取支援有三種RMI,JGroups,JMS,這裡介紹下MRI和JGrpups兩種方式,Ehcache使用版本為1.5.0,關於ehcache的其他資訊請參考http://ehcache.sourceforge.net/EhcacheUserGuide.html

關於jgroups的資訊請參考http://www.jgroups.org/manual/html_single/index.html。

環境為兩臺機器 server1 ip:192.168.2.154,server2 ip:192.168.2.23

1. RMI方式:

rmi的方式配置要點(下面均是server1上的配置,server2上的只需要把ip兌換即可)

a. 配置PeerProvider

Xml程式碼

<cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"

properties="peerDiscovery=manual,rmiUrls=//192.168.2.23:40001/userCache|//192.168.2.23:40001/resourceCache" />

配置中通過手動方式同步sever2中的userCache和resourceCache。

b. 配置CacheManagerPeerListener

Xml程式碼

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

配置中server1監聽本機40001埠。

c. 在每一個cache中新增cacheEventListener,例子如下:

Xml程式碼

<cache name="userCache" maxElementsInMemory="10000" eternal="true" overflowToDisk="true" timeToIdleSeconds="0" timeToLiveSeconds="0"diskPersistent="false" diskExpiryThreadIntervalSeconds="120">
<cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" properties="replicateAsynchronously=true, replicatePuts=true, replicateUpdates=true,replicateUpdatesViaCopy= false, replicateRemovals= true " />
</cache>

屬性解釋:

必須屬性:

        name:設定快取的名稱,用於標誌快取,惟一

        maxElementsInMemory:在記憶體中最大的物件數量

        maxElementsOnDisk:在DiskStore中的最大物件數量,如為0,則沒有限制

        eternal:設定元素是否永久的,如果為永久,則timeout忽略

        overflowToDisk:是否當memory中的數量達到限制後,儲存到Disk

可選的屬性:

        timeToIdleSeconds:設定元素過期前的空閒時間

        timeToLiveSeconds:設定元素過期前的活動時間

        diskPersistent:是否disk store在虛擬機器啟動時持久化。預設為false

   diskExpiryThreadIntervalSeconds:執行disk終結執行緒的時間,預設為120

       memoryStoreEvictionPolicy:策略關於Eviction

快取子元素:

    cacheEventListenerFactory:註冊相應的的快取監聽類,用於處理快取事件,如put,remove,update,expire

    bootstrapCacheLoaderFactory:指定相應的BootstrapCacheLoader,用於在初始化快取,以及自動設定。

2. JGroups方式:

ehcache 1.5.0之後版本支援的一種方式,配置起來比較簡單,要點:

a. 配置PeerProvider,使用tcp的方式,例子如下:

Xml程式碼

<cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.jgroups.JGroupsCacheManagerPeerProviderFactory"
properties="connect=TCP(start_port=7800):
TCPPING(initial_hosts=192.168.2.154[7800],192.168.2.23[7800];port_range=10;timeout=3000;
num_initial_members=3;up_thread=true;down_thread=true):
VERIFY_SUSPECT(timeout=1500;down_thread=false;up_thread=false):
pbcast.NAKACK(down_thread=true;up_thread=true;gc_lag=100;retransmit_timeout=3000):
pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;shun=false;
print_local_addr=false;down_thread=true;up_thread=true)"
propertySeparator="::" />

b.為每個cache新增cacheEventListener

Xml程式碼

<cache name="userCache" maxElementsInMemory="10000" eternal="true"
overflowToDisk="true" timeToIdleSeconds="0" timeToLiveSeconds="0"
diskPersistent="false" diskExpiryThreadIntervalSeconds="120">
<cacheEventListenerFactory class="net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory"
properties="replicateAsynchronously=true, replicatePuts=true,
replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true"/>
</cache>

JGroup方式配置的兩個server上的配置檔案一樣,若有多個server,在initial_hosts中將server ip加上即可。

一個完整的ehcache.xml檔案:

Xml程式碼

<cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.jgroups.JGroupsCacheManagerPeerProviderFactory"
properties="connect=TCP(start_port=7800):
TCPPING(initial_hosts=192.168.2.154[7800],192.168.2.23[7800];port_range=10;timeout=3000;
num_initial_members=3;up_thread=true;down_thread=true):
VERIFY_SUSPECT(timeout=1500;down_thread=false;up_thread=false):
pbcast.NAKACK(down_thread=true;up_thread=true;gc_lag=100;retransmit_timeout=3000):
pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;shun=false;
print_local_addr=false;down_thread=true;up_thread=true)"
propertySeparator="::" />
<defaultCache maxElementsInMemory="10000" eternal="true"
overflowToDisk="true" timeToIdleSeconds="0" timeToLiveSeconds="0"
diskPersistent="false" diskExpiryThreadIntervalSeconds="120">
<cacheEventListenerFactory class="net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory"
properties="replicateAsynchronously=true, replicatePuts=true,
replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true"/>
</defaultCache>
<cache name="velcroCache" maxElementsInMemory="10000" eternal="true"
overflowToDisk="true" timeToIdleSeconds="0" timeToLiveSeconds="0"
diskPersistent="false" diskExpiryThreadIntervalSeconds="120">
<cacheEventListenerFactory class="net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory"
properties="replicateAsynchronously=true, replicatePuts=true,
replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true"/>
</cache>
<cache name="userCache" maxElementsInMemory="10000" eternal="true"
overflowToDisk="true" timeToIdleSeconds="0" timeToLiveSeconds="0"
diskPersistent="false" diskExpiryThreadIntervalSeconds="120">
<cacheEventListenerFactory class="net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory"
properties="replicateAsynchronously=true, replicatePuts=true,
replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true"/>
</cache>
<cache name="resourceCache" maxElementsInMemory="10000"
eternal="true" overflowToDisk="true" timeToIdleSeconds="0"
timeToLiveSeconds="0" diskPersistent="false"
diskExpiryThreadIntervalSeconds="120">
<cacheEventListenerFactory class="net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory"
properties="replicateAsynchronously=true, replicatePuts=true,
replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true"/>
</cache>
</ehcache>
ehcache分散式快取不是很理想,用memcached做一級快取會更加地高效和易用。