ehcache 分布式集群同步數據實例


本文使用rmi方式,借鑒百度能搜到的文章,但是均不能做到數據同步,做了些改動完全沒問題,更詳細說明介紹百度即可。直奔主題,可運行的demo實例!

創建一個maven項目,配置pom

pom.xml

<dependencies>
        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
            <version>2.10.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.5.8</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.5.8</version>
        </dependency>

        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache-jgroupsreplication</artifactId>
            <version>1.7</version>
        </dependency>
    </dependencies>

服務器A 配置

ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">

    <diskStore path="java.io.tmpdir/ehcache" />

    <!-- 指定除自身之外的網絡群體中其他提供同步的主機列表,多台機器配置 用'|'分割 -->
    <cacheManagerPeerProviderFactory
        class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
        properties="peerDiscovery=manual,rmiUrls=//192.168.1.74:4005/demoCache">
    </cacheManagerPeerProviderFactory>
    
    <cacheManagerPeerListenerFactory
        class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
        properties="hostName=192.168.1.23,port=4005,socketTimeoutMillis=120000" /> 
    
    <!-- 
    多播方式配置
    搜索某個網段上的緩存 timeToLive 
    0是限制在同一個服務器 
    1是限制在同一個子網 
    32是限制在同一個網站 
    64是限制在同一個region 
    128是限制在同一個大洲 255是不限制 
    <cacheManagerPeerProviderFactory
        class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
        properties="peerDiscovery=automatic, multicastGroupAddress=224.1.1.1,
        multicastGroupPort=40000, timeToLive=32" /> -->
        
    <!-- 默認緩存 -->
    <defaultCache maxElementsInMemory="1000" eternal="true"
        timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
        diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000"
        diskPersistent="true" diskExpiryThreadIntervalSeconds="120"
        memoryStoreEvictionPolicy="LRU">
    </defaultCache>

    <!-- demo緩存 -->
    <cache name="demoCache" maxElementsInMemory="1000" eternal="false"
        timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
        diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000"
        diskPersistent="false" diskExpiryThreadIntervalSeconds="120"
        memoryStoreEvictionPolicy="LRU">
        <cacheEventListenerFactory
            class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" />
        <!-- 用於在初始化緩存,以及自動設置 -->
        <bootstrapCacheLoaderFactory
            class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory" />
    </cache>
</ehcache>

測試代碼。

Mytest.java

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;

public class Mytest {
    public static void main(String[] args) throws InterruptedException {
        CacheManager manager = new CacheManager("src/test/resources/ehcache.xml");   

        //get Cache        
        Cache cache = manager.getCache("demoCache");     
        Thread.sleep(10000); 
        Element element = new Element("key","test");  
        cache.put(element);  

        System.out.println("Initial:\n"//+url.toString() 
        +"\n"+manager.getName() 
        +"\n"+cache.getName() 
        +" 's size = "+cache.getSize() 
        +"\n"+element.toString());     


        Element element01 = cache.get("key");        
        System.out.println(element01.getValue());  
        System.out.println("主機測試等待中.............");  
        
        while(true){ 
        Thread.sleep(1000); 
        } 
    } 
}

服務器B

ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">

    <diskStore path="java.io.tmpdir/ehcache" />

    <cacheManagerPeerProviderFactory
        class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
        properties="peerDiscovery=manual,rmiUrls=//192.168.1.23:4005/demoCache">
    </cacheManagerPeerProviderFactory>
    
    <cacheManagerPeerListenerFactory
        class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
        properties="hostName=192.168.1.74,port=4005,socketTimeoutMillis=120000" /> 
    
    <!-- 
    多播方式配置
    搜索某個網段上的緩存 timeToLive 
    0是限制在同一個服務器 
    1是限制在同一個子網 
    32是限制在同一個網站 
    64是限制在同一個region 
    128是限制在同一個大洲 255是不限制 
    <cacheManagerPeerProviderFactory
        class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
        properties="peerDiscovery=automatic, multicastGroupAddress=224.1.1.1,
        multicastGroupPort=40000, timeToLive=32" /> -->
        
    <!-- 默認緩存 -->
    <defaultCache maxElementsInMemory="1000" eternal="true"
        timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
        diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000"
        diskPersistent="true" diskExpiryThreadIntervalSeconds="120"
        memoryStoreEvictionPolicy="LRU">
    </defaultCache>

    <!-- demo緩存 -->
    <cache name="demoCache" maxElementsInMemory="1000" eternal="false"
        timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
        diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000"
        diskPersistent="false" diskExpiryThreadIntervalSeconds="120"
        memoryStoreEvictionPolicy="LRU">
        <cacheEventListenerFactory
            class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" />
        <!-- 用於在初始化緩存,以及自動設置 -->
        <bootstrapCacheLoaderFactory
            class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory" />
    </cache>
</ehcache>

測試代碼

MyTest.java

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;

public class Mytest {
    public static void main(String[] args) throws InterruptedException {
        CacheManager manager = new CacheManager("src/test/resources/ehcache.xml");   

        //get Cache        
        Cache cache = manager.getCache("demoCache");     
        Thread.sleep(10000); 


        while(true){ 
            System.out.println("搜索中...");  
            System.out.println("當前資源數:" + cache.getSize());  
            Element element = cache.get("key");  
            if (element != null) {  
                System.out.println(element.getValue());   
                break;  
            } 
        Thread.sleep(1000); 
        } 
    } 
}

 先運行服務器A,在運行服務器B。

效果:

服務器A

服務器B

 

完成!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM