本文分享一下ehcache的使用心得,本文主要講以廣播的形式同步緩存。java
下面講述主要分爲兩個部分,一個是配置文件,一個是Java代碼。web
1.準備jar包:spring
slf4j-api-1.7.12.jar,ehcache-core-2.4.3.jar,ehcache-web-2.0.4.jar
備註:1) 版本能夠不一樣
2)sl4j可能與JavaEE6.0中的衝突,在JVM中運行時能夠不使用。bootstrap
2.配置文件:api
2.1. 完整xml(廣播形式)緩存
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
http://www.springmodules.org/schema/cache/springmodules-cache.xsd
http://www.springmodules.org/schema/ www.wanmeiyule11.cn cache/springmodules-ehcache.xsd"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="false">
<!-- 默認緩存 -->
<defaultCache eternal="false" maxElementsInMemory="10000"
overflowToDisk="false" timeToIdleSeconds="0" timeToLiveSeconds="0"
memoryStoreEvictionPolicy="LFU" />
<!-- 自定義緩存 -->
<cache name="myCache" eternal="true" maxElementsInMemory="10000"
overflowToDisk="false" timeToIdleSeconds="0" timeToLiveSeconds="0"
memoryStoreEvictionPolicy="LFU">
<!-- 監聽RMI同步緩存對象配置 註冊相應的的緩存監聽類,用於處理緩存事件,如put,remove,update,和expire -->
<cacheEventListenerFactory
class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
properties="replicateAsynchronously=true, replicatePuts=true,
replicatePutsViaCopy=true, replicateUpdates=true,
replicateUpdatesViaCopy=true, replicateRemovals=true,
asynchronousReplicationIntervalMillis=200"/>
<!-- 用於在初始化緩存,以及自動設置 -->
<bootstrapCacheLoaderFactory
class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"/>
</cache>
<!--搜索某個網段上的緩存
timeToLive
0是限制在同一個服務器
1是限制在同一個子網
32是限制在同一個網站
64是限制在同一個region
128是限制在同一個大洲
255是不限制-->
<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" properties="peerDiscovery=automatic,ysylcsvip.cn multicastGroupAddress=230.0.0.1,multicastGroupPort=4446,timeToLive=32,hostName=localhost" />
<cacheManagerPeerListenerFactory
class="net.sf.ehcache.distribution. www.ysylcsvip.cn RMICacheManagerPeerListenerFactory" />
2.1. 關鍵部分
ehcache
|——defaultCache (默認cache配置)
|——cache (自定義cache)
|——|——cacheEventListenerFactory(同步動做)
|——|——bootstrapCacheLoaderFactory(工廠是指啓動是指一啓動就同步數據)
|——cacheManagerPeerProviderFactory(發佈:廣播)
|——cacheManagerPeerListenerFactory(監聽)
同步緩存必須有的幾個部分:服務器
1)cacheEventListenerFactory
每一個要進行同步的cache都須要設置一個用來向CacheManagerr的成員複製消息的緩存事件監聽器。這個工做要經過爲每一個cache的配置增長一個cacheEventListenerFactory元素來完成。app
<cacheEventListenerFactory
class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
properties="replicateAsynchronously=true, replicatePuts=true,
replicatePutsViaCopy=true, replicateUpdates=true,
replicateUpdatesViaCopy=true, replicateRemovals=true,
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 www.vboyule66.cn | false – 當一個元素被拷貝到其餘的cache中時是否進行復制(指定爲true時爲複製),默認是true。socket
2)cacheManagerPeerProviderFactory(廣播方式)
自動方式:自動發現方式使用tcp廣播來創建和包含一個廣播組,它的特徵是最小配置和對成員組的自動添加和管理。沒有那個服務器是有優先級的。對等點每一秒中向廣播組發送心跳,若是一個對等點在五秒鐘內沒發送過來,則此對等點將會被刪除,若是有新的,則會被加入集羣
<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
peerDiscovery 方式:atutomatic 爲自動 ;mulicastGroupAddress 廣播組地址:230.0.0.1;mulicastGroupPort 廣播組端口:40001;timeToLive是指搜索範圍:0是同一臺服務器,1是同一個子網,32是指同一站點,64是指同一塊地域,128是同一塊大陸,還有個256,我就不說了;hostName:主機名或者ip,用來接受或者發送信息的接口
3)cacheManagerPeerListenerFactory
將方式配好以後須要配置listener纔會有用,接下來說講:Listener
Listener是用來監遵從集羣發送過來的信息
Listenner有兩個屬性:class和propertis
class 一個完整的工廠類名
properties 都好分割的對facotory有用的屬性
<cacheManagerPeerListenerFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory" />
1
2
1
2
hostName指的是本機,這裏注意若是使用的localhost,則只會對本機有效,請使用子網內的ip地址或者主機名,port端口 40001,socketTimeoutMillis是指socket子模塊的超時時間,默認是2000ms,注意port兩臺主機能夠相同能夠不一樣。最好相同,我的建議.
參考文檔
1.分佈式緩存
2.實例項目
3.實例項目(推薦)
4.詳細介紹
5.IBM版介紹
2.Java代碼
客戶機1
package src.text;
import java.lang.management.ManagementFactory;
import javax.management.MBeanServer;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
import net.sf.ehcache.management.ManagementService;
public class EHCacheTest {
private static CacheManager manager = null; // 緩存工廠
public static void main(String[] args) {
EHCacheTest ehCacheTest = new EHCacheTest();
ehCacheTest.init();
}
protected void init() {
// 讀入配置
String path = this.getClass().getClassLoader().getResource("").getPath() + "ehcache.xml";
manager = CacheManager.create(path);
// 打印初始緩存
String[] cacheNames = manager.getCacheNames();
printNames(cacheNames);
// 移除緩存
// cacheManager.removeCache("sampleDistributedCache1");
cacheNames = manager.getCacheNames();
printNames(cacheNames);
// distributed -- rmi同步
Cache cache = manager.getCache("fhxxCache");
// 註冊被管理的Bean
// JMX -- jconsole(MBeanServer)
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
ManagementService.registerMBeans(manager, mBeanServer, true, true, true, true);
for (int i = 0; i < 100000; i++) {
Element temp = cache.get("ehcache");
System.out.println("cache.getSize()=" + cache.getSize());
cache.put(new Element(i, i));
System.out.println("=======================");
System.out.println("第" + i + "次cache.put");
if (temp != null) {
System.out.println(temp.getObjectValue());
} else {
System.out.println("NotFound");
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private static void printNames(String[] names) {
System.out.println("=======================");
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
客戶機2
package src.text;
import java.lang.management.ManagementFactory;
import javax.management.MBeanServer;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
import net.sf.ehcache.Statistics;
import net.sf.ehcache.management.ManagementService;
public class EHCacheTest2 {
private static CacheManager manager = null; // 緩存工廠
public static void main(String[] args) {
EHCacheTest2 ehCacheTest2 = new EHCacheTest2();
ehCacheTest2.init();
}
protected void init() {
// 讀入配置
String path = this.getClass().getClassLoader().getResource("").getPath() + "ehcache.xml";
manager = CacheManager.create(path);
// 打印初始緩存
String[] cacheNames = manager.getCacheNames();
// 註冊管理Bean
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
ManagementService.registerMBeans(manager, mBeanServer, true, true, true, true);
// distributed
Cache cache = manager.getCache("fhxxCache");
// 添加值後另外一個虛擬機的緩存經過RMI會同步緩存,並讀到這個值
cache.put(new Element("ehcache", "newaddvalue11"));
printCache(cache);
for (int i = 0; i < 10000; i++) {
try {
cache.put(new Element("ehcache", "newaddvalue" + i));
Thread.sleep(3000);
System.out.println("第" + i + "次加載cache.size=" + cache.getSize());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private static void printCache(Cache cache) {
int size = cache.getSize();
long memSize = cache.getMemoryStoreSize();
long diskSize = cache.getDiskStoreSize();
Statistics stat = cache.getStatistics();
StringBuilder sb = new StringBuilder();
sb.append("size=" + size + ";memsize=" + memSize);
sb.append(";diskSize=" + diskSize + ";");
運行客戶機1,開始:
第0次cache.put
NotFound
客戶機2,開始後,客戶機1
=======================第29次cache.putnewaddvalue3