• 分布式ehcache缓存


    今天在这里了记录一下学习ehcache分布式集群的过程。
    ehcache的三种最为常用集群方式,分别是 RMI、JGroups 以及 EhCache Server 。
    这里主要讲一下rmi方式。

    1、添加依赖

    <dependency>
      <groupId>net.sf.ehcache</groupId>
      <artifactId>ehcache</artifactId>
      <version>2.10.3</version>
    </dependency>
    

    2、配置文件

    spring.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:cache="http://www.springframework.org/schema/cache"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">
    
        <!-- 自动扫描注解的bean -->
        <context:component-scan base-package="com.yitop.feng" />
    
        <!-- 启用缓存注解功能(请将其配置在Spring主配置文件中) -->
        <cache:annotation-driven cache-manager="cacheManager" />
    
        <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
            <property name="cacheManager" ref="ehcache"></property>
        </bean>
    
        <bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
            <property name="configLocation" value="classpath:ehcache.xml"></property>
        </bean>
    
    </beans>
    

    server1的ehcache.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:noNamespaceSchemaLocation="ehcache.xsd">
    
        <!--
        配置提供者
            1、peerDiscovery,提供者方式,有两种方式:自动发现(automatic)、手动配置(manual)
            2、rmiUrls,手动方式时提供者的地址,多个的话用|隔开
        -->
        <cacheManagerPeerProviderFactory
                class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
                properties="peerDiscovery=manual,rmiUrls=//192.168.30.51:40002/cachetest"
        />
    
        <!--
        配置监听器
            1、hostName 主机地址
            2、port 端口
            3、socketTimeoutMillis socket子模块的超时时间,默认是2000ms
        -->
        <cacheManagerPeerListenerFactory
                class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
                properties="hostName=192.168.30.51, port=40001, socketTimeoutMillis=2000"
        />
    
        <!-- 默认缓存 -->
        <defaultCache
                maxEntriesLocalHeap="10000"
                eternal="false"
                timeToIdleSeconds="120"
                timeToLiveSeconds="120"
                maxEntriesLocalDisk="10000000"
                diskExpiryThreadIntervalSeconds="120"
                memoryStoreEvictionPolicy="LRU"/>
    
    
        <!-- cachetest缓存 缓存时间为5秒 -->
        <cache name="cachetest"
               maxElementsInMemory="1000"
               eternal="false"
               timeToIdleSeconds="300"
               timeToLiveSeconds="300"
               overflowToDisk="false"
               memoryStoreEvictionPolicy="LRU">
    
            <!--
            配置缓存事件监听器
                replicateAsynchronously  操作是否异步,默认值为true.
                replicatePuts 添加操作是否同步到集群内的其他缓存,默认为true.
                replicateUpdates 更新操作是否同步到集群内的其他缓存,默认为true.
                replicateUpdatesViaCopy 更新之后的对象是否复制到集群中的其他缓存(true);
                replicateRemovals 删除操作是否同步到集群内的其他缓存,默认为true.
            -->
            <cacheEventListenerFactory
                    class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
                    properties="
                    replicateAsynchronously=true,
                    replicatePuts=true,
                    replicateUpdates=true,
                    replicateUpdatesViaCopy=true,
                    replicateRemovals=true "/>
    
            <!-- 初始化缓存,以及自动设置-->
            <bootstrapCacheLoaderFactory class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"/>
        </cache>
    
    </ehcache>
    

    server2的ehcache.xml只要把提供者和监听者的端口调换就可以了

    3、测试

    这里是随便写个查询和写入缓存的方法

    @CachePut(value = "cachetest", key = "#key")
    public String put(String key, String value) {
        System.out.println("保存数据, " + key + " : " + value);
        
        return value;
    }
    
    @Cacheable(value = "cachetest", key = "#name")
    public String getName(String name) {
        return String.valueOf(System.currentTimeMillis());
    }
    

    下面是两个测试类,模拟两台服务器
    test1

    package com.yitop.feng;
    
      import com.yitop.feng.service.EhcacheTestService;
      import org.junit.Test;
      import org.junit.runner.RunWith;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.test.context.ContextConfiguration;
      import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
      import java.util.Scanner;
    
      /**
       * @author fengzp
       * @date 17/3/1下午2:19
       * @email fengzp@gzyitop.com
       * @company 广州易站通计算机科技有限公司
       */
      @RunWith(SpringJUnit4ClassRunner.class)
      @ContextConfiguration(locations = {"classpath:spring.xml"})
      public class EhcacheTest {
    
          @Autowired
          private EhcacheTestService ehcacheTestService;
    
          @Test
          public void test() throws InterruptedException {
              String name = "feng";
    
              int i = 1;
    
              while (true){
                  String o = ehcacheTestService.getName(name + i);
                  System.out.println(i + " : " + o);
                  i++;
                  Thread.sleep(1000);
                  if(i > 5) i = 1;
              }
          }
      }
    

    test2:

    	package com.yitop.feng;
    
      import com.yitop.feng.service.EhcacheTestService;
      import org.junit.Test;
      import org.junit.runner.RunWith;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.cache.Cache;
      import org.springframework.test.context.ContextConfiguration;
      import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
      import java.util.Scanner;
    
      /**
       * @author fengzp
       * @date 17/3/1下午2:19
       * @email fengzp@gzyitop.com
       * @company 广州易站通计算机科技有限公司
       */
      @RunWith(SpringJUnit4ClassRunner.class)
      @ContextConfiguration(locations = {"classpath:test2/spring2.xml"})
      public class EhcacheTest2 {
    
          @Autowired
          private EhcacheTestService ehcacheTestService;
    
          @Test
          public void test() throws InterruptedException {
    
              String name = "feng";
    
              int i = 1;
    
              while (true){
                  String o = ehcacheTestService.getName(name + i);
                  System.out.println(i + " : " + o);
                  i++;
                  if(i > 5){
                      i = 1;
                      break;
                  }
              }
    
              Thread.sleep(5000);
    
              while (true) {
                  ehcacheTestService.put(name + i, i++ + "");
                  if(i > 5) break;
              }
    
              while (true){
    
              }
    
          }
      }
    

    4、结果

    这里先启动test1,等它把数据都写到缓存后,启动test2。可以看到test2启动后能够读取到test1的缓存, 并且之后test2更新缓存后,test1也能同时更新,说明缓存已经成功集群到两边。

  • 相关阅读:
    那些花儿
    RIATest 安装与破解
    是什么让你的ExtJS应用程序运行缓慢?
    企业级系统架构的理解
    ExtJS 4.0.1发布:提高性能和错误修复
    ExtJS 4动态加载组件
    Step by Step WebMatrix网站开发之二:使用WebMatrix(3)
    四大类NoSQL数据库
    ExtJS 4中动态加载的路径设置
    性能提高和支持IE 9的新的ExtJS发布版:4.02和3.4
  • 原文地址:https://www.cnblogs.com/andyfengzp/p/6530322.html
Copyright © 2020-2023  润新知