`

EhCache 分布式缓存/缓存集群

 
阅读更多

转载:http://www.blogjava.net/hoojo/archive/2012/07/19/383518.html

开发环境:

System:Windows

JavaEE Server:tomcat5.0.2.8、tomcat6

JavaSDK: jdk6+

IDE:eclipse、MyEclipse 6.6

 

开发依赖库:

JDK6、 JavaEE5、ehcache-core-2.5.2.jar

Email:hoojo_@126.com

Blog:http://blog.csdn.net/IBM_hoojo

http://hoojo.cnblogs.com/

http://hoojo.blogjava.net

 

前面2篇文章介绍到Ehcache 整合Spring 使用页面、对象缓存 http://www.cnblogs.com/hoojo/archive/2012/07/12/2587556.html  

在Spring、Hibernate中使用Ehcache缓存 http://www.cnblogs.com/hoojo/archive/2012/07/12/2587941.html

 

一、缓存系统简介

EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点,是 Hibernate 中默认的 CacheProvider。

EhCache 应用架构图,下图是 EhCache 在应用程序中的位置:

clip_image002

EhCache 的主要特性有:

1. 快速、精干;

2. 简单;

3. 多种缓存策略;

4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题;

5. 缓存数据会在虚拟机重启的过程中写入磁盘;

6. 可以通过 RMI、可插入 API 等方式进行分布式缓存;

7. 具有缓存和缓存管理器的侦听接口;

8. 支持多缓存管理器实例,以及一个实例的多个缓存区域;

9. 提供 Hibernate 的缓存实现;

由 于 EhCache 是进程中的缓存系统,一旦将应用部署在集群环境中,每一个节点维护各自的缓存数据,当某个节点对缓存数据进行更新,这些更新的数据无法在其它节点中共享, 这不仅会降低节点运行的效率,而且会导致数据不同步的情况发生。例如某个网站采用 A、B 两个节点作为集群部署,当 A 节点的缓存更新后,而 B 节点缓存尚未更新就可能出现用户在浏览页面的时候,一会是更新后的数据,一会是尚未更新的数据,尽管我们也可以通过 Session Sticky 技术来将用户锁定在某个节点上,但对于一些交互性比较强或者是非 Web 方式的系统来说,Session Sticky 显然不太适合。

所以就需要用到 EhCache 的集群解决方案。

从1.2版本开始,Ehcache可以使用分布式的缓存了。EhCache 从 1.7 版本开始,支持五种集群方案,分别是:

• Terracotta

• RMI

• JMS

• JGroups

• EhCache Server

其中的三种最为常用集群方式,分别是 RMI、JGroups 以及 EhCache Server 。本文主要介绍RMI的方式。

分 布式这个特性是以plugin的方式实现的。Ehcache自带了一些默认的分布式缓存插件实现,这些插件可以满足大部分应用的需要。如果需要使用其他的 插件那就需要自己开发了,开发者可以通过查看distribution包里的源代码及JavaDoc来实现它。尽管不是必须的,在使用分布式缓存时理解一 些ehcahce的设计思想也是有帮助的。这可以参看分布式缓存设计的页面。以下的部分将展示如何让分布式插件同ehcache一起工作。

下面列出的是一些分布式缓存中比较重要的方面:

• 你如何知道集群环境中的其他缓存?

• 分布式传送的消息是什么形式?

• 什么情况需要进行复制?增加(Puts),更新(Updates)或是失效(Expiries)?

• 采用什么方式进行复制?同步还是异步方式?

为了安装分布式缓存,你需要配置一个PeerProvider、一个CacheManagerPeerListener,

它们对于一个CacheManager来说是全局的。每个进行分布式操作的cache都要添加一个cacheEventListener来传送消息。

 

二、集群缓存概念及其配置

正确的元素类型

只有可序列化的元素可以进行复制。一些操作,比如移除,只需要元素的键值而不用整个元素;在这样的操作中即使元素不是可序列化的但键值是可序列化的也可以被复制。

成员发现(Peer Discovery)

Ehcache进行集群的时候有一个cache组的概念。每个cache都是其他cache的一个peer,没有主cache的存在。刚才我们问了一个问题:你如何知道集群环境中的其他缓存?这个问题可以命名为成员发现(Peer Discovery)。

Ehcache提供了两种机制用来进行成员发现,就像一辆汽车:手动档和自动档。要使用一个内置的成员发现机制要在ehcache的配置文件中指定cacheManagerPeerProviderFactory元素的class属性为

net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory。

自动的成员发现

自动的发现方式用TCP广播机制来确定和维持一个广播组。它只需要一个简单的配置可以自动的在组中添加和移除成员。在集群中也不需要什么优化服务器的知识,这是默认推荐的。

成员每秒向群组发送一个“心跳”。如果一个成员 5秒种都没有发出信号它将被群组移除。如果一个新的成员发送了一个“心跳”它将被添加进群组。

任何一个用这个配置安装了复制功能的cache都将被其他的成员发现并标识为可用状态。

要设置自动的成员发现,需要指定ehcache配置文件中cacheManagerPeerProviderFactory元素的properties属性,就像下面这样:
peerDiscovery=automatic

multicastGroupAddress=multicast address | multicast host name

multicastGroupPort=port

timeToLive=0-255 (timeToLive属性详见常见问题部分的描述)

示例

假设你在集群中有两台服务器。你希望同步sampleCache1和sampleCache2。每台独立的服务器都要有这样的配置:
配置server1和server2

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

手动进行成员发现

进行手动成员配置要知道每个监听器的IP地址和端口。成员不能在运行时动态地添加和移除。在技术上很难使用广播的情况下就可以手动成员发现,例如在 集群的服务器之间有一个不能传送广播报文的路由器。你也可以用手动成员发现进行单向的数据复制,只让server2知道server1,而server1 不知道server2。

配置手动成员发现,需要指定ehcache配置文件中cacheManagerPeerProviderFactory的properties属性,像下面这样:
peerDiscovery=manual rmiUrls=//server:port/cacheName, //server:port/cacheName ...
rmiUrls配置的是服务器cache peers的列表。注意不要重复配置。

示例

假设你在集群中有两台服务器。你要同步sampleCache1和sampleCache2。下面是每个服务器需要的配置:
配置server1

<
cacheManagerPeerProviderFactory
<!-- CRLF-->
class
="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
<!-- CRLF-->
properties
="peerDiscovery=manual,
<!-- CRLF-->
rmiUrls=//server2:40001/sampleCache11|//server2:40001/sampleCache12"/>
<!-- CRLF-->

 

配置server2

<
cacheManagerPeerProviderFactory
<!-- CRLF-->
class
="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
<!-- CRLF-->
properties
="peerDiscovery=manual,
<!-- CRLF-->
rmiUrls=//server1:40001/sampleCache11|//server1:40001/sampleCache12"/>
<!-- CRLF-->

配置CacheManagerPeerListener

每个CacheManagerPeerListener监听从成员们发向当前CacheManager的消息。配置 CacheManagerPeerListener需要指定一个CacheManagerPeerListenerFactory,它以插件的机制实现, 用来创建CacheManagerPeerListener。

cacheManagerPeerListenerFactory的属性有:
class – 一个完整的工厂类名。
properties – 只对这个工厂有意义的属性,使用逗号分隔。

Ehcache有一个内置的基于RMI的分布系统。它的监听器是RMICacheManagerPeerListener,这个监听器可以用

RMICacheManagerPeerListenerFactory来配置。

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

有效的属性是:
hostname (可选) – 运行监听器的服务器名称。标明了做为集群群组的成员的地址,同时也是你想要控制的从集群中接收消息的接口。

在CacheManager初始化的时候会检查hostname是否可用。

如果hostName不可用,CacheManager将拒绝启动并抛出一个连接被拒绝的异常。

如果指定,hostname将使用InetAddress.getLocalHost().getHostAddress()来得到。

警告:不要将localhost配置为本地地址127.0.0.1,因为它在网络中不可见将会导致不能从远程服务器接收信息从而不能复制。在同一台机器上有多个CacheManager的时候,你应该只用localhost来配置。

port – 监听器监听的端口。
socketTimeoutMillis (可选) – Socket超时的时间。默认是2000ms。当你socket同步缓存请求地址比较远,不是本地局域网。你可能需要把这个时间配置大些,不然很可能延时导致同步缓存失败。

配置CacheReplicators

每个要进行同步的cache都需要设置一个用来向CacheManagerr的成员复制消息的缓存事件监听器。这个工作要通过为每个cache的配置增加一个cacheEventListenerFactory元素来完成。

<!-- Sample cache named sampleCache2. -->
<!-- CRLF-->
<
cache
 name
="sampleCache2"
<!-- CRLF-->
maxElementsInMemory
="10"
<!-- CRLF-->
eternal
="false"
<!-- CRLF-->
timeToIdleSeconds
="100"
<!-- CRLF-->
timeToLiveSeconds
="100"
<!-- CRLF-->
overflowToDisk
="false"
>
<!-- CRLF-->
<
cacheEventListenerFactory
 class
="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
<!-- CRLF-->
properties
="replicateAsynchronously=true,replicatePuts=true, replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true "
/>
<!-- CRLF-->
</
cache
>
<!-- CRLF-->

class – 使用net.sf.ehcache.distribution.RMICacheReplicatorFactory

这个工厂支持以下属性:
replicatePuts=true | false – 当一个新元素增加到缓存中的时候是否要复制到其他的peers. 默认是true。
replicateUpdates=true | false – 当一个已经在缓存中存在的元素被覆盖时是否要进行复制。默认是true。
replicateRemovals= true | false – 当元素移除的时候是否进行复制。默认是true。
replicateAsynchronously=true | false – 复制方式是异步的(指定为true时)还是同步的(指定为false时)。默认是true。
replicatePutsViaCopy=true | false – 当一个新增元素被拷贝到其他的cache中时是否进行复制指定为true时为复制,默认是true。
replicateUpdatesViaCopy=true | false – 当一个元素被拷贝到其他的cache中时是否进行复制(指定为true时为复制),默认是true。

你可以使用ehcache的默认行为从而减少配置的工作量,默认的行为是以异步的方式复制每件事;你可以像下面的例子一样减少RMICacheReplicatorFactory的属性配置:

<!-- Sample cache named sampleCache4. All missing RMICacheReplicatorFactory properties default to true -->
<!-- CRLF-->
<
cache
 name
="sampleCache4"
<!-- CRLF-->
maxElementsInMemory
="10"
<!-- CRLF-->
eternal
="true"
<!-- CRLF-->
overflowToDisk
="false"
<!-- CRLF-->
memoryStoreEvictionPolicy
="LFU"
>
<!-- CRLF-->
<
cacheEventListenerFactory
 class
="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
/>
<!-- CRLF-->
</
cache
>
<!-- CRLF-->

 

常见的问题

Windows上的Tomcat

有一个Tomcat或者是JDK的bug,在tomcat启动时如果tomcat的安装路径中有空格的话,在启动时RMI监听器会失败。参见 http://archives.java.sun.com/cgi-bin/wa?A2=ind0205&L=rmi-users& P=797和http://www.ontotext.com/kim/doc/sys-doc/faq-howto-bugs/known-bugs.html

由于在Windows上安装Tomcat默认是装在“Program Files”文件夹里的,所以这个问题经常发生。

广播阻断

自动的peer discovery与广播息息相关。广播可能被路由阻拦,像Xen和VMWare这种虚拟化的技术也可以阻拦广播。如果这些都打开了,你可能还在要将你的网卡的相关配置打开。一个简单的办法可以告诉广播是否有效,

那就是使用ehcache remote debugger来看“心跳”是否可用。

广播传播的不够远或是传得太远

你可以通过设置badly misnamed time to live来控制广播传播的距离。用广播IP协议时,timeToLive的值指的是数据包可以传递的域或是范围。约定如下:

0是限制在同一个服务器

1是限制在同一个子网

32是限制在同一个网站

64是限制在同一个region

128是限制在同一个大洲

255是不限制

译者按:上面这些资料翻译的不够准确,请读者自行寻找原文理解吧。

在Java实现中默认值是1,也就是在同一个子网中传播。改变timeToLive属性可以限制或是扩展传播的范围。

 

三、 RMI方式缓存集群/配置分布式缓存

RMI 是 Java 的一种远程方法调用技术,是一种点对点的基于 Java 对象的通讯方式。EhCache 从 1.2 版本开始就支持 RMI 方式的缓存集群。在集群环境中 EhCache 所有缓存对象的键和值都必须是可序列化的,也就是必须实现 java.io.Serializable 接口,这点在其它集群方式下也是需要遵守的。

 

     下图是 RMI 集群模式的结构图:

      clip_image004

采用 RMI 集群模式时,集群中的每个节点都是对等关系,并不存在主节点或者从节点的概念,因此节点间必须有一个机制能够互相认识对方,必须知道其它节点的信息,包括 主机地址、端口号等。EhCache 提供两种节点的发现方式:手工配置和自动发现。手工配置方式要求在每个节点中配置其它所有节点的连接信息,一旦集群中的节点发生变化时,需要对缓存进行重 新配置。

由于 RMI 是 Java 中内置支持的技术,因此使用 RMI 集群模式时,无需引入其它的 Jar 包,EhCache 本身就带有支持 RMI 集群的功能。使用 RMI 集群模式需要在 ehcache.xml 配置文件中定义 cacheManagerPeerProviderFactory 节点。

 

      分布式同步缓存要让这边的 cache 知道对方的 cache ,叫做 Peer Discovery (成员发现) EHCache 实现成员发现的方式有两种:

1、 手动查找

A、 在ehcache.xml中配置PeerDiscovery成员发现对象

      Server1配置,配置本地hostName、port是400001,分别监听192.168.8.32:400002的mobileCache和 192.168.5.231:400003 的mobileCache。注意这里的mobileCache是缓存的名称,分别对应着server2、server3的cache的配置。

<?
xml
 version
="1.0"
 encoding
="gbk"
?>
<!-- CRLF-->
<
ehcache
 xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation
="ehcache.xsd"
>
<!-- CRLF-->
    <
diskStore
 path
="java.io.tmpdir"
/>
<!-- CRLF-->
 
<!-- CRLF-->
    <!-- 
<!-- CRLF-->
        集群多台服务器中的缓存,这里是要同步一些服务器的缓存
<!-- CRLF-->
        server1 hostName:192.168.8.9 port:400001 cacheName:mobileCache
<!-- CRLF-->
        server2 hostName:192.168.8.32 port:400002 cacheName:mobileCache
<!-- CRLF-->
        server3 hostName:192.168.8.231 port:400003 cacheName:mobileCache
<!-- CRLF-->
        注意:每台要同步缓存的服务器的RMI通信socket端口都不一样,在配置的时候注意设置
<!-- CRLF-->
    -->
<!-- CRLF-->
    
<!-- CRLF-->
    <!-- server1 的cacheManagerPeerProviderFactory配置 -->
<!-- CRLF-->
    <
cacheManagerPeerProviderFactory
 
<!-- CRLF-->
        class
="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
 
<!-- CRLF-->
        properties
="hostName=localhost,
<!-- CRLF-->
        port=400001,
<!-- CRLF-->
        socketTimeoutMillis=2000,
<!-- CRLF-->
        peerDiscovery=manual,
<!-- CRLF-->
        rmiUrls=//192.168.8.32:400002/mobileCache|//192.168.5.231:400003/mobileCache"
<!-- CRLF-->
    />
<!-- CRLF-->
</
ehcache
>
<!-- CRLF-->

以上注意cacheManagerPeerProviderFactory元素出现的位置在diskStore下

 

同样在你的另外2台服务器上增加配置

Server2,配置本地host,port为400002,分别同步192.168.8.9:400001的mobileCache和192.168.5.231:400003的mobileCache

<!-- server2 的cacheManagerPeerProviderFactory配置 -->
<!-- CRLF-->
<
cacheManagerPeerProviderFactory
 
<!-- CRLF-->
    class
="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
 
<!-- CRLF-->
    properties
="hostName=localhost,
<!-- CRLF-->
    port=400002,
<!-- CRLF-->
    socketTimeoutMillis=2000,
<!-- CRLF-->
    peerDiscovery=manual,
<!-- CRLF-->
    rmiUrls=//192.168.8.9:400001/mobileCache|//192.168.5.231:400003/mobileCache"
<!-- CRLF-->
/>
<!-- CRLF-->

Server3,配置本地host,port为400003,分别同步192.168.8.9:400001的mobileCache缓存和192.168.8.32:400002的mobileCache缓存

<!-- server3 的cacheManagerPeerProviderFactory配置 -->
<!-- CRLF-->
<
cacheManagerPeerProviderFactory
 
<!-- CRLF-->
    class
="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
 
<!-- CRLF-->
    properties
="hostName=localhost,
<!-- CRLF-->
    port=400003,
<!-- CRLF-->
    socketTimeoutMillis=2000,
<!-- CRLF-->
    peerDiscovery=manual,
<!-- CRLF-->
    rmiUrls=//192.168.8.9:400001/mobileCache|//192.168.8.32:400002/mobileCache"
<!-- CRLF-->
/>
<!-- CRLF-->

这样就在三台不同的服务器上配置了手动查找cache的PeerProvider成员发现的配置了。 值得注意的是你在配置rmiUrls的时候要特别注意url不能重复出现,并且端口、地址都是对的。

如果指定,hostname将使用InetAddress.getLocalHost().getHostAddress()来得到。

警告:不要将localhost配置为本地地址127.0.0.1,因为它在网络中不可见将会导致不能从远程服务器接收信息从而不能复制。在同一台机器上有多个CacheManager的时候,你应该只用localhost来配置。

 

B、 下面配置缓存和缓存同步监听,需要在每台服务器中的ehcache.xml文件中增加cache配置和cacheEventListenerFactory、cacheLoaderFactory的配置

<
defaultCache
 maxElementsInMemory
="10000"
 eternal
="false"
 timeToIdleSeconds
="30"
 timeToLiveSeconds
="30"
 overflowToDisk
="false"
/>
<!-- CRLF-->
<!-- 
<!-- CRLF-->
    配置自定义缓存
<!-- CRLF-->
    maxElementsInMemory:缓存中允许创建的最大对象数
<!-- CRLF-->
    eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。
<!-- CRLF-->
    timeToIdleSeconds:缓存数据空闲的最大时间,也就是说如果有一个缓存有多久没有被访问就会被销毁,如果该值是 0 就意味着元素可以停顿无穷长的时间。
<!-- CRLF-->
    timeToLiveSeconds:缓存数据存活的时间,缓存对象最大的的存活时间,超过这个时间就会被销毁,这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。
<!-- CRLF-->
    overflowToDisk:内存不足时,是否启用磁盘缓存。
<!-- CRLF-->
    memoryStoreEvictionPolicy:缓存满了之后的淘汰算法。
<!-- CRLF-->
    
<!-- CRLF-->
    每一个小时更新一次缓存(1小时过期) 
<!-- CRLF-->
-->
<!-- CRLF-->
<
cache
 name
="mobileCache"
<!-- CRLF-->
    maxElementsInMemory
="10000"
<!-- CRLF-->
    eternal
="false"
<!-- CRLF-->
    overflowToDisk
="true"
<!-- CRLF-->
    timeToIdleSeconds
="1800"
<!-- CRLF-->
    timeToLiveSeconds
="3600"
<!-- CRLF-->
    memoryStoreEvictionPolicy
="LFU"
>
<!-- CRLF-->
    <!-- 
<!-- CRLF-->
        RMI缓存分布同步查找 class使用net.sf.ehcache.distribution.RMICacheReplicatorFactory
<!-- CRLF-->
        这个工厂支持以下属性:
<!-- CRLF-->
        replicatePuts=true | false – 当一个新元素增加到缓存中的时候是否要复制到其他的peers。默认是true。
<!-- CRLF-->
        replicateUpdates=true | false – 当一个已经在缓存中存在的元素被覆盖时是否要进行复制。默认是true。
<!-- CRLF-->
        replicateRemovals= true | false – 当元素移除的时候是否进行复制。默认是true。
<!-- CRLF-->
        replicateAsynchronously=true | false – 复制方式是异步的指定为true时,还是同步的,指定为false时。默认是true。
<!-- CRLF-->
        replicatePutsViaCopy=true | false – 当一个新增元素被拷贝到其他的cache中时是否进行复制指定为true时为复制,默认是true。
<!-- CRLF-->
        replicateUpdatesViaCopy=true | false – 当一个元素被拷贝到其他的cache中时是否进行复制指定为true时为复制,默认是true。
<!-- CRLF-->
            asynchronousReplicationIntervalMillis=1000
<!-- CRLF-->
        -->
<!-- CRLF-->
    <!-- 监听RMI同步缓存对象配置 注册相应的的缓存监听类,用于处理缓存事件,如put,remove,update,和expire -->
<!-- CRLF-->
    <
cacheEventListenerFactory
<!-- CRLF-->
        class
="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
<!-- CRLF-->
        properties
="replicateAsynchronously=true, 
<!-- CRLF-->
        replicatePuts=true, 
<!-- CRLF-->
        replicateUpdates=true,
<!-- CRLF-->
        replicateUpdatesViaCopy=false, 
<!-- CRLF-->
        replicateRemovals=true "/>
<!-- CRLF-->
    <!-- 用于在初始化缓存,以及自动设置 -->
<!-- CRLF-->
    <
bootstrapCacheLoaderFactory
 class
="net.sf.ehcache.bootstrap.BootstrapCacheLoaderFactory"
/>
<!-- CRLF-->
</
cache
>
<!-- CRLF-->

 

C、 这样就完成了3台服务器的配置,下面给出server1的完整的ehcache.xml的配置

<?
xml
 version
="1.0"
 encoding
="gbk"
?>
<!-- CRLF-->
<
ehcache
 xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation
="ehcache.xsd"
>
<!-- CRLF-->
    <
diskStore
 path
="java.io.tmpdir"
/>
<!-- CRLF-->
 
<!-- CRLF-->
    <!-- 
<!-- CRLF-->
        集群多台服务器中的缓存,这里是要同步一些服务器的缓存
<!-- CRLF-->
        server1 hostName:192.168.8.9 port:400001 cacheName:mobileCache
<!-- CRLF-->
        server2 hostName:192.168.8.32 port:400002 cacheName:mobileCache
<!-- CRLF-->
        server3 hostName:192.168.8.231 port:400003 cacheName:mobileCache
<!-- CRLF-->
        注意每台要同步缓存的服务器的RMI通信socket端口都不一样,在配置的时候注意设置
<!-- CRLF-->
    -->
<!-- CRLF-->
    
<!-- CRLF-->
    <!-- server1 的cacheManagerPeerProviderFactory配置 -->
<!-- CRLF-->
    <
cacheManagerPeerProviderFactory
 
<!-- CRLF-->
        class
="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
 
<!-- CRLF-->
        properties
="hostName=localhost,
<!-- CRLF-->
        port=400001,
<!-- CRLF-->
        socketTimeoutMillis=2000,
<!-- CRLF-->
        peerDiscovery=manual,
<!-- CRLF-->
        rmiUrls=//192.168.8.32:400002/mobileCache|//192.168.5.231:400003/mobileCache"
<!-- CRLF-->
    />
<!-- CRLF-->
    
<!-- CRLF-->
    <
defaultCache
 maxElementsInMemory
="10000"
 eternal
="false"
 timeToIdleSeconds
="30"
 timeToLiveSeconds
="30"
 overflowToDisk
="false"
/>
<!-- CRLF-->
    <!-- 
<!-- CRLF-->
        配置自定义缓存
<!-- CRLF-->
        maxElementsInMemory:缓存中允许创建的最大对象数
<!-- CRLF-->
        eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。
<!-- CRLF-->
        timeToIdleSeconds:缓存数据空闲的最大时间,也就是说如果有一个缓存有多久没有被访问就会被销毁,
<!-- CRLF-->
                    如果该值是 0 就意味着元素可以停顿无穷长的时间。
<!-- CRLF-->
        timeToLiveSeconds:缓存数据存活的时间,缓存对象最大的的存活时间,超过这个时间就会被销毁,
<!-- CRLF-->
                    这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。
<!-- CRLF-->
        overflowToDisk:内存不足时,是否启用磁盘缓存。
<!-- CRLF-->
        memoryStoreEvictionPolicy:缓存满了之后的淘汰算法。
<!-- CRLF-->
        
<!-- CRLF-->
        每一个小时更新一次缓存(1小时过期) 
<!-- CRLF-->
    -->
<!-- CRLF-->
    <
cache
 name
="mobileCache"
<!-- CRLF-->
        maxElementsInMemory
="10000"
<!-- CRLF-->
        eternal
="false"
<!-- CRLF-->
        overflowToDisk
="true"
<!-- CRLF-->
        timeToIdleSeconds
="1800"
<!-- CRLF-->
        timeToLiveSeconds
="3600"
<!-- CRLF-->
        memoryStoreEvictionPolicy
="LFU"
>
<!-- CRLF-->
        <!-- 
<!-- CRLF-->
            RMI缓存分布同步查找 class使用net.sf.ehcache.distribution.RMICacheReplicatorFactory
<!-- CRLF-->
            这个工厂支持以下属性:
<!-- CRLF-->
            replicatePuts=true | false – 当一个新元素增加到缓存中的时候是否要复制到其他的peers。默认是true。
<!-- CRLF-->
            replicateUpdates=true | false – 当一个已经在缓存中存在的元素被覆盖时是否要进行复制。默认是true。
<!-- CRLF-->
            replicateRemovals= true | false – 当元素移除的时候是否进行复制。默认是true。
<!-- CRLF-->
            replicateAsynchronously=true | false – 复制方式是异步的指定为true时,还是同步的,指定为false时。默认是true。
<!-- CRLF-->
            replicatePutsViaCopy=true | false – 当一个新增元素被拷贝到其他的cache中时是否进行复制指定为true时为复制,默认是true。
<!-- CRLF-->
            replicateUpdatesViaCopy=true | false – 当一个元素被拷贝到其他的cache中时是否进行复制指定为true时为复制,默认是true。
<!-- CRLF-->
                asynchronousReplicationIntervalMillis=1000
<!-- CRLF-->
            -->
<!-- CRLF-->
        <!-- 监听RMI同步缓存对象配置 注册相应的的缓存监听类,用于处理缓存事件,如put,remove,update,和expire -->
<!-- CRLF-->
        <
cacheEventListenerFactory
<!-- CRLF-->
            class
="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
<!-- CRLF-->
            properties
="replicateAsynchronously=true, 
<!-- CRLF-->
            replicatePuts=true, 
<!-- CRLF-->
            replicateUpdates=true,
<!-- CRLF-->
            replicateUpdatesViaCopy=false, 
<!-- CRLF-->
            replicateRemovals=true "/>
<!-- CRLF-->
        <!-- 用于在初始化缓存,以及自动设置 -->
<!-- CRLF-->
        <
bootstrapCacheLoaderFactory
 class
="net.sf.ehcache.bootstrap.BootstrapCacheLoaderFactory"
/>
<!-- CRLF-->
    </
cache
>
<!-- CRLF-->
</
ehcache
>
<!-- CRLF-->

2、 自动发现

自动发现配置和手动查找的方式有一点不同,其他的地方都基本是一样的。同样在ehcache.xml中增加配置,配置如下

<!--
<!-- CRLF-->
搜索某个网段上的缓存
<!-- CRLF-->
timeToLive
<!-- CRLF-->
    0是限制在同一个服务器
<!-- CRLF-->
    1是限制在同一个子网
<!-- CRLF-->
    32是限制在同一个网站
<!-- CRLF-->
    64是限制在同一个region
<!-- CRLF-->
    128是限制在同一个大洲
<!-- CRLF-->
    255是不限制
<!-- CRLF-->
-->
<!-- CRLF-->
<
cacheManagerPeerProviderFactory
<!-- CRLF-->
    class
="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
<!-- CRLF-->
    properties
="peerDiscovery=automatic, multicastGroupAddress=192.168.0.1,
<!-- CRLF-->
    multicastGroupPort=400004, timeToLive=32"
<!-- CRLF-->
/>
<!-- CRLF-->

其他的配置和手动查找方式的配置是一样的,这里就不再赘述了。关于ehcache的其他缓存配置方式这里将不再介绍,大家可以自己去研究。可以参考:

官方文档:http://www.ehcache.org/documentation/user-guide/cache-topologies#using-a-cache-server

ibm developerworks文档:http://www.ibm.com/developerworks/cn/java/j-lo-ehcache/index.html

分享到:
评论

相关推荐

    Ehcache分布式缓存与其在SpringBoot应用

    在分布式环境中,Ehcache通过使用JGROUP来实现分布式缓存。JGROUP是一个用于构建可靠集群通信的库,可以提供组成员资格、故障检测、传输协议等多种功能,使得Ehcache能够在多个节点之间共享和同步缓存数据。Ehcache...

    Ehcache分布式缓存与其在spring中的使用

    ### Ehcache分布式缓存及其在Spring中的应用 #### 一、Ehcache概述与原理 Ehcache是一款高效且轻量级的纯Java缓存框架,由于其出色的性能和易于集成的特点,在Java开发中有着广泛的应用。作为Hibernate的默认缓存...

    基于JGROUPS的ehcache的分布式缓存复制

    总的来说,基于JGROUPS的Ehcache分布式缓存复制是提高Java应用性能和可扩展性的一个有效途径。它结合了Ehcache的强大缓存功能和JGROUPS的可靠集群通信能力,为开发者提供了一种灵活、高效的数据共享解决方案。通过...

    Ehcache分布式缓存NoSQL深入浅出

    Ehcache是Java语言编写使用最广的分布式缓存。本套课程讲解全新的Ehcache?3.1版本,内容全面实用。涵盖缓存分层、缓存过期和剔除策略、缓存层序列化、多种缓存使用模式、事件监听器、XA事务、分布式缓存集群。

    分布式缓存EhCache用户指南.docx

    【分布式缓存 EhCache 用户指南】 EhCache 是一个广泛使用的Java缓存库,自1.2版本开始,它引入了分布式缓存的功能,允许在多台机器间共享和同步数据,以支持大规模、高并发的应用场景。分布式缓存通过插件机制实现...

    分布式缓存.docx

    本文将深入探讨Ehcache作为JVM缓存和分布式缓存的角色,以及Redis作为分布式缓存的解决方案,包括其分片集群、哨兵系统、数据结构、主从复制以及避免缓存问题的策略。 首先,我们了解为什么需要使用缓存。缓存的...

    30_分布式缓存相关面试题的回答技巧总结.zip

    Java中常用的分布式缓存框架有Spring Cache、Ehcache、Hibernate Second Level Cache等,其中Spring Data Redis和Jedis提供了与Redis的集成。 4. **Redis和Memcached的区别** - Redis支持数据持久化,而Memcached...

    EHCache 分布式配置文件

    总结来说,EHCache 的分布式配置文件是实现高效、可靠的分布式缓存系统的核心,通过精细调整这些配置,我们可以优化缓存性能,提升整个系统的响应速度,并确保数据的一致性和可用性。理解并熟练掌握这些配置是成为一...

    ehcache项目缓存技术

    3. **分布式缓存**:Ehcache支持分布式部署,通过 Terracotta Server 集群,可以在多台服务器间共享和同步缓存,提供高可用性和负载均衡。 4. **缓存策略**:除了LRU和LFU,Ehcache还提供了TTL(Time To Live)和...

    集群环境中使用_EhCache_缓存系统&Ehcache配置文件的详细说明

    EhCache是一个开源的、高性能的Java分布式缓存系统,常用于提高应用程序的性能和响应速度,尤其是在处理大量数据时。在集群环境中使用EhCache,可以实现数据的共享和一致性,有效减轻数据库的压力。本篇文章将深入...

    分布式缓存架构11.docx

    ### 分布式缓存架构与Ehcache集群详解 #### 一、为什么使用缓存? 在现代互联网系统中,为了提高系统的响应速度和降低数据库的压力,缓存技术被广泛应用。缓存通过暂时存储数据副本的方式来加快数据访问的速度,...

    异步复制与同步复制 以及ehcache的小tips和我的配置

    它支持本地缓存、分布式缓存,并提供了多种缓存策略,包括LRU(最近最少使用)、LFU(最不经常使用)和FIFO(先进先出)等。Ehcache还支持缓存的热备份和复制,以便在节点故障时保持数据的可用性。 配置Ehcache进行...

    Spring Boot 2.x基础教程:使用EhCache缓存集群.docx

    为了解决这个问题,我们需要配置EhCache缓存集群,以确保数据更新能在各个进程中同步。以下是如何使用EhCache实现缓存集群的详细步骤: 首先,确保缓存对象是可序列化的。在上述例子中,`User`实体需要实现`...

    EHCache缓存技术介绍

    分布式缓存,例如在集群环境中,涉及到多个应用实例和JVM之间的数据共享。通过远程通信技术,如RMI或JMS,实现缓存数据的同步。分布式缓存适用于读取操作频繁且对并发性能要求高的场景,但在读写操作均衡或数据库被...

    Ehcache集群实例

    综上所述,Ehcache集群结合JGroups和RMI提供了强大的分布式缓存解决方案。理解这些组件的工作原理和配置方法对于开发和维护高性能、高可用的应用至关重要。在实际应用中,根据业务需求调整配置,以实现最佳的性能和...

    Ehcache Java 缓存框架 v3.10.8.zip

    8. **分布式缓存**:利用 Terracotta Server 集群,Ehcache可以实现跨节点的缓存共享,增强了应用的可伸缩性。 9. **缓存复制**:在网络中的节点之间,Ehcache能够自动复制数据,确保数据的一致性。 10. **缓存...

    Java缓存框架 EhCache

    3. **多级缓存**:EhCache支持构建分布式缓存系统,通过Terracotta服务器实现多个节点之间的缓存共享,形成分布式缓存集群。这使得多台服务器上的应用可以共享同一份缓存,提高数据一致性并分散负载。 4. **缓存...

    金民一期婚姻管理测试系统_开发框架功能点-分布式缓存.pdf

    本文将深入探讨该系统中采用的分布式缓存——Ehcache,以及其在系统中的应用与配置。 1. **Ehcache介绍** Ehcache是一款开源、高性能、轻量级的Java缓存库,广泛应用于Java应用程序中,提供本地内存缓存和分布式...

    Ehcache 整合Spring 使用页面、对象缓存

    5. **集群和分布式缓存**: - Ehcache支持集群和分布式环境,通过 Terracotta 服务器实现跨节点的数据共享和一致性。 - 配置Ehcache以利用分布式特性,确保多个应用服务器间的缓存同步。 通过上述步骤,Ehcache ...

    大型分布式系统中的缓存架构

    Ehcache是一款流行的Java缓存解决方案,提供从进程内缓存到分布式缓存的扩展能力。其特性包括自动过期策略和多种缓存策略,支持TB级缓存。 **Guava Cache** Guava Cache是Google的开源Java库Guava的一部分,提供了...

Global site tag (gtag.js) - Google Analytics