ehcache分布式缓存

Nginx+ Ehcache + Tomcat 集群实现 Ehcache 缓存共享

环境信息

主机 端口 开源软件
10.10.3.83 80 Nginx(1.12.2)
10.15.0.174 10080 Tomcat(8.5)
10.15.0.174 20080 Tomcat(8.5)

实验拓扑图:

配置文件修改

修改 ehcache.xml

本次演示使用的是手动指定地址模式,两台 Tomcat 唯一的不同就是:发布端口和监听端口对调。

Tomcat_10080

<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
    <!-- 当缓存超出最大值时 应该序列化到硬盘 的路径 -->
    <diskStore path="java.io.tmpdir" />

    <cacheManagerPeerProviderFactory
            class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
            properties="peerDiscovery=manual,rmiUrls=//127.0.0.1:4000/sysCache">
    </cacheManagerPeerProviderFactory>

    <cacheManagerPeerListenerFactory
            class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
            properties="hostName=127.0.0.1,port=5000,socketTimeoutMillis=120000" />

    <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="600" overflowToDisk="true" diskPersistent="true" />

    <!-- 用于保存查询结果集 -->
    <cache name="org.hibernate.cache.StandardQueryCache" maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="4200" overflowToDisk="true" />
    <!-- 用于保存最近查询的一系列表的时间戳 -->
    <cache name="org.hibernate.cache.UpdateTimestampsCache" maxElementsInMemory="5000" eternal="true" timeToIdleSeconds="0" timeToLiveSeconds="0" overflowToDisk="false" />

    <!-- sysCache缓存 -->
    <cache name="sysCache" 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>

Tomcat_20080

<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
    <!-- 当缓存超出最大值时 应该序列化到硬盘 的路径 -->
    <diskStore path="java.io.tmpdir" />

    <cacheManagerPeerProviderFactory
            class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
            properties="peerDiscovery=manual,rmiUrls=//127.0.0.1:5000/sysCache">
    </cacheManagerPeerProviderFactory>

    <cacheManagerPeerListenerFactory
            class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
            properties="hostName=127.0.0.1,port=4000,socketTimeoutMillis=120000" />

    <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="600" overflowToDisk="true" diskPersistent="true" />

    <!-- 用于保存查询结果集 -->
    <cache name="org.hibernate.cache.StandardQueryCache" maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="4200" overflowToDisk="true" />
    <!-- 用于保存最近查询的一系列表的时间戳 -->
    <cache name="org.hibernate.cache.UpdateTimestampsCache" maxElementsInMemory="5000" eternal="true" timeToIdleSeconds="0" timeToLiveSeconds="0" overflowToDisk="false" />

    <!-- sysCache缓存 -->
    <cache name="sysCache" 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>

修改 applicationContext.xml

<!-- 引用ehCache的配置 -->
<bean id="defaultCacheManager"
      class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
  <property name="configLocation">
    <value>classpath:ehcache-rmi-4000.xml</value>
  </property>
</bean>
<!-- 定义ehCache的工厂,并设置所使用的Cache name -->
<bean id="ehCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
  <property name="cacheManager">
    <ref local="defaultCacheManager" />
  </property>
  <property name="cacheName">
    <value>demoCache</value>
  </property>
</bean>

工具类编写

简单使用一个工具类完成 get、put 操作。

/**
 * Ehcache共享操作
 *
 * @author HoldDie
 * @version v1.0.0
 * @email holddie@163.com
 * @date 2018/2/5 15:57
 */
public class EhcachedUtil {

    private static Cache cache = ((Cache) SpringContextHolder.getBean("ehCache"));

    public static Cache getSysCache() {
        return cache;
    }

    public static Object get(String key) {
        Element element = cache.get(key);
        return element == null ? null : element.getObjectValue();
    }

    public static void put(String key, Object value) {
        Element element = new Element(key, value);
        cache.put(element);
    }

}

数据验证

配置完然后分别启动两台 Tomcat,访问测试页面。

测试页面代码的功能是一个累加操作,在输入一个数值的之后,点击提交,然后刷新另一台机器,查看数据是否同步。

首先进入测试页面

然后在 20080 上做累加操作:

刷新 10080 页面:

同步操作刷新:

至此,两台 Tomcat 使用的 Ehcache 实现了同步操作。

参考链接:


文章作者: HoldDie
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 HoldDie !
评论
 上一篇
Tomcat集群环境下Session共享--Memcached Tomcat集群环境下Session共享--Memcached
主要记录一下 Nginx + Memcached + Tomcat 实现 Session 共享 集群环境信息 主机 端口 开源软件 10.10.3.83 80 Nginx(1.12.2) 10.15.0.174 35080
2018-02-02
下一篇 
现代负载均衡和代理技术简介 现代负载均衡和代理技术简介
现代网络负载均衡和代理技术简介 最近我注意到,针对负载均衡和代理这两项现代网络技术,有教育意义的介绍性材料相当稀缺。这引起我的思考:为什么会这样?在可靠的分布系统的架构中,负载均衡是核心概念之一,这一地位要求有对应的高质量信息。然而经过搜
2018-01-31
  目录