IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]Ehcache分布式缓存实现

    lfsf802发表于 2015-09-29 19:18:12
    love 0

    开篇

    ehcache提供三种网络连接策略来实现集群,rmi,jgroup还有jms。同时ehcache可以可以实现多播的方式实现集群,也可以手动指定集群主机序列实现集群。
    
    Ehcache支持的分布式缓存支持有三种RMI,JGroups,JMS,这里介绍下MRI和JGrpups两种方式,Ehcache使用版本为1.5.0.
        环境为两台机器 server1 ip:192.168.2.154,server2 ip:192.168.2.23
    

    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 " />
    
    属性解释:
    必须属性:
            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,用于在初始化缓存,以及自动设置。
    

    JGroups方式

    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代码
    
    <?xml version="1.0" encoding="UTF-8"?>
    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ehcache.sf.net/ehcache.xsd">
    <diskStore path="java.io.tmpdir" />
    
    <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的分布式缓存支持了。



沪ICP备19023445号-2号
友情链接