• ehcache 集群使用 rmi方式 有图有真想


    来源:http://www.tuicool.com/articles/MJzYZbR

    ehcache 有几种方式集群 ,rmi,jgroup还有jms;这里讲一下ehcache的使用

    ehcache 使用rmi方式复制缓存是可取的,原因如下:

    1、rmi是java 默认的远程机制

    3、Elements因为要存到磁盘,所以肯定是早已序列化。所以不需要借助xml格式化什么的

    4、通过配置可以通过防火墙

    Ehcache的rmi方式是一种点对点的协议,因此它会产生很多局域网的内部通信,当然Ehcache会通过一种异步批处复制理机制类解决

    如果要配置ehcache 需要配置一下元素

    PeerProvider

    CacheManagerPeerListener

    配置Provider,这里有两种方式:自动发现、手动配置

    自动方式:自动发现方式使用tcp广播来建立和包含一个广播组,它的特征是最小配置和对成员组的自动添加和管理。没有那个服务器是有优先级的。对等点每一秒中向广播组发送心跳,如果一个对等点在五秒钟内没发送过来,则此对等点将会被删除,如果有新的,则会被加入集群

    cacheManagerPeerProviderFactory  的properties有以下配置:

    peerDiscovery=automatic

    multicastGroupAddress=230.0.0.1

    multicastGroupPort=40001

    timeToLive=0-255 

    hostName=hostname

       peerDiscovery 方式:atutomatic 为自动 ;mulicastGroupAddress 广播组地址:230.0.0.1;mulicastGroupPort 广播组端口:40001;timeToLive是指搜索范围:0是同一台服务器,1是同一个子网,32是指同一站点,64是指同一块地域,128是同一块大陆,还有个256,我就不说了;hostName:主机名或者ip,用来接受或者发送信息的接口

    在我这次试验中具体如下:

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

    当然还有一种方式就是手动配置,贴上例子,但不作叙述了

    <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"/>

    将方式配好之后需要配置listener才会有用,接下来讲讲:Listener

    Listener是用来监听从集群发送过来的信息

    Listenner有两个属性:class和propertis

    class 一个完整的工厂类名

    properties 都好分割的对facotory有用的属性

    此次实验具体配置如下:

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

    hostName指的是本机,这里注意如果使用的localhost,则只会对本机有效,请使用子网内的ip地址或者主机名,port端口 40001,socketTimeoutMillis是指socket子模块的超时时间,默认是2000ms,注意port两台主机可以相同可以不同。最好相同,个人建议

    然后配置缓存的复制 Replicators:

    本机配置如下:

    <cache name="myCache" maxEntriesLocalHeap="10" eternal="false"
        timeToIdleSeconds="10000" timeToLiveSeconds="10000" overflowToDisk="false">
        <cacheEventListenerFactory
          class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
          properties="replicateAsynchronously=true, replicatePuts=true, replicateUpdates=true,
                  replicateUpdatesViaCopy=false, replicateRemovals=true,asynchronousReplicationIntervalMillis=1000"
                   />
         <bootstrapCacheLoaderFactory  
                    class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"/> 
      </cache>

    name为cache制定名字,maxEntriesLocalHeap:内存中可驻留最大Element数量,timeToLiveSeconds 生存周期 10000s;overflowToDisk:当内存不足,是否启用磁盘:这里为false;给myCache价格监听,然后是异步方式,在put,update,copy,remove操作是否复制,然后同步时间1s,bootstrapCacheLoaderFactory 工厂是指启动是指一启动就同步数据

    以下是完整的配置

    <?xml version="1.0" encoding="UTF-8"?>
    
    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"
      monitoring="autodetect" dynamicConfig="true">
    
      <diskStore path="D:/ehcache/diskStore" />
    
      <cacheManagerPeerProviderFactory
        class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
        properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1,
          multicastGroupPort=4446, timeToLive=32,hostName=192.168.1.101" />
    
      <cacheManagerPeerListenerFactory
        class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
        properties="hostName=192.168.1.101, port=40001,
      socketTimeoutMillis=2000" />
    
      <cache name="myCache" maxEntriesLocalHeap="10" eternal="false"
        timeToIdleSeconds="10000" timeToLiveSeconds="10000" overflowToDisk="false">
        <cacheEventListenerFactory
          class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
          properties="replicateAsynchronously=true, replicatePuts=true, replicateUpdates=true,
                  replicateUpdatesViaCopy=false, replicateRemovals=true,asynchronousReplicationIntervalMillis=1000"
                   />
         <bootstrapCacheLoaderFactory  
                    class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"/> 
      </cache>
    </ehcache>

    在server2 也就是 192.168.1.116 在hostName配置成此地址,就行了

    下面是测试代码

    package com.ehcache;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    import net.sf.ehcache.Cache;
    import net.sf.ehcache.CacheException;
    import net.sf.ehcache.CacheManager;
    import net.sf.ehcache.Element;
    
    
    
    
    
    public class Test2 {
         public static void main(String[] args) throws InterruptedException {  
           InputStream is=null;
        CacheManager manager=null;
        try {
          is = Test2.class.getResourceAsStream("/ehcache.xml");
             manager = CacheManager.newInstance(is);
        } catch (CacheException e1) {
          try {
            if(is!=null){
            is.close();
            is=null;
            }
          } catch (IOException e) {
            e.printStackTrace();
          }
          e1.printStackTrace();
        }
           
             Cache cache = manager.getCache("myCache");  
        
             Element element = new Element("client3" + System.currentTimeMillis(), "client3");  
             cache.put(element);  
             int i=0;
             while (true)  
             {  
          	   Element element2 = new Element("client-3-"+i,i); 
                 cache.put(element2);
                 Thread.sleep(3000);  
                 System.out.println("
    ");  
                 for (Object key : cache.getKeys())  
                 {  
                     System.out.println(key + ":" + cache.get(key).getObjectValue());  
                 }  
                 i++;
             }  
          }
    }

    server2 的测试代码将 element那里改成client-2-即可

    然后贴上效果图一张:

    client3 同步到client2的数据了

    另外附叙述ehcache的淘汰缓存的算法:

    LRU是Least Recently Used 近期最少使用算法;

    FIFO 以一种队列方式谁先进谁先出

    LFU least frequently used 即最不经常使用页置换算法

  • 相关阅读:
    数据库的接口
    BionicThe README from the bionic/libc
    发现问题——创新的原动力
    使用ADO或ADO控件访问数据库
    游标、事务并发和锁三者之间的那点事
    处女座——菜鸟程序员的工程总结
    数据库的基础知识以及创建数据库
    《Team Geek》前言(中文,自己翻译的)
    万里长征,始于足下——菜鸟程序员的学习总结(一)
    与RMAN相关的动态性能视图
  • 原文地址:https://www.cnblogs.com/duwanjiang/p/5916129.html
Copyright © 2020-2023  润新知