ehcache 有几种方式集群,rmi,jgroup还有jms;这里讲一下ehcache的使用 ehcache 使用rmi方式复制缓存是可取的,原因如下: 1、rmi是java 默认的远程机制 2、可以调优tcp选项 3、elements因为要存到磁盘,所以肯定是早已序列化。所以不需要借助xml格式化什么的
ehcache 有几种方式集群,rmi,jgroup还有jms;这里讲一下ehcache的使用
ehcache 使用rmi方式复制缓存是可取的,原因如下:
1、rmi是java 默认的远程机制
2、可以调优tcp选项
3、elements因为要存到磁盘,所以肯定是早已序列化。所以不需要借助xml格式化什么的
4、通过配置可以通过防火墙
rmi方式集群交互图:
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,用来接受或者发送信息的接口
在我这次试验中具体如下:
当然还有一种方式就是手动配置,贴上例子,但不作叙述了
server1
server2
将方式配好之后需要配置listener才会有用,接下来讲讲:listener
listener是用来监听从集群发送过来的信息
listenner有两个属性:class和propertis
class 一个完整的工厂类名
properties 都好分割的对facotory有用的属性
此次实验具体配置如下:
hostname指的是本机,这里注意如果使用的localhost,则只会对本机有效,请使用子网内的ip地址或者主机名,port端口 40001,sockettimeoutmillis是指socket子模块的超时时间,默认是2000ms,注意port两台主机可以相同可以不同。最好相同,个人建议然后配置缓存的复制 replicators:
本机配置如下:
name为cache制定名字,maxentrieslocalheap:内存中可驻留最大element数量,timetoliveseconds 生存周期 10000s;overflowtodisk:当内存不足,是否启用磁盘:这里为false;给mycache价格监听,然后是异步方式,在put,update,copy,remove操作是否复制,然后同步时间1s,bootstrapcacheloaderfactory 工厂是指启动是指一启动就同步数据以下是完整的配置
在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(\n); 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 以一种队列方式谁先进谁先出
lfuleast frequently used即最不经常使用页置换算法
这是工程文件的下载地址:点击打开链接
备注:作者水平有限,并且这些配置只在局域网的实践过,如果有错误,请指出。
前面也写了并且试验了局域网内的,负载均衡,tomcat集群,session回话的分离并且双机热备,希望以后有机会让来亲自架构一下大规模的集群。