ehcache使用文档_第1页
ehcache使用文档_第2页
ehcache使用文档_第3页
ehcache使用文档_第4页
ehcache使用文档_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Ehcache使用文档 作者:兰东平 Email:landongpingpub2012年2月1 基本介绍1.1 前言Ehcache是一个快速的、轻量级的、易于使用的、进程内的缓存。它支持read-only 和read/write 缓存,内存和磁盘缓存。是一个非常轻量级的缓存实现,而且从1.2 之后就支持了集群,目前的最新版本是2.5。简单地说来,ehcache有以下特点:l 快速.l 简单.l 多种缓存策略l 缓存数据有两级:内存和磁盘,因此无需担心容量问题l 缓存数据会在虚拟机重启的过程中写入磁盘l 可以通过RMI、可插入API 等方式进行分布式缓存l 具有缓存和缓存管理器的侦听接口l 支持

2、多缓存管理器实例,以及一个实例的多个缓存区域l 提供Hibernate 的缓存实现2 安装和使用2.1 下载Ehcache的官方网站/downloads/catalog 上面可以下载到各种版本。目前用最新版本是2.5.1,下载这个版本即可。(下载之前,会要求用户注册,按照要求输入即可)。建议下载文件,因为这个文件包含了所有Ehcache的内容。2.2 安装2.2.1 发布包内容说明将解压到本地文件系统。在安装之前,我们先来大致看看发布包里边的内容,如下图2.1所示。 图2.1如一般的开源框架发布包类似,ehcahce的发布包包含以下目录内容:javadoc:e

3、hcache的API文档;lib:ehcache要用到的第三方jar包和自己的jar包;licenses:ehcache的授权文件;samples:ehcache的例子目录;src:ehcache的源代码目录;terracotta:使用terracotta集群时的terracotta服务;ehcache.xml:ehcache的配置文件模板,包括各个配置的英文解释;ehcache.xsd:ehcache.xml文件的验证文件模板;QUICK-START.html:快速开始文件,会连接到ehcache的官方网站;README.html:ehcache版本功能和新特性说明文件。除了阅读本文档快速地

4、学习和了解ehcache的功能,也可以通过ehcache自带的快速开始文件进行学习。2.2.2 安装到项目工程Ehcache的安装方法比较简单,将解压开的发布包下的lib /、lib /和lib/放置到类路径下面即可使用。如下图2.2所示: 图2.2其中,和两个jar包,用于ehcache的日志输出,是第三方jar包。关于这两个jar包的用法和功能特性,请查阅slf4j框架的相关功能。3 开始一个例子3.1 新建一个空的java project工程通过eclipse向导新建一个Java Project工程ehcache-test,并将上面提的三个类添加到类路径下。工程如下图3.1所示: 图3.

5、1其中的lib目录,我专门用来存放jar包。3.2 工程中添加配置文件3.2.1 新建配置文件存放目录在ehcache-test工程中新建专门用于存放配置文件的包,根据我们的习惯,该包取名为“conf”。3.2.2 加入ehcache配置文件在刚才新建的conf包下加入发布包目录下的ehcache.xml和ehcache.xsd两个配置文件。(注意,这两个配置文件要放在同一目录下。如果需要将ehcache.xsd文件放到其他目录,需要修改ehcache.xml文件中的xsi:noNamespaceSchemaLocation="ehcache.xsd"配置项)经过以上步骤操

6、作,工程目录结构如下图3.2所示:3.2.3 修改ehcache.xml配置文件内容正如先前所述,ehcache.xml是ehcache的配置文件模板,每一项配置的说明都相当详细。在修改该配置文件之前,如果大家有兴趣,不妨先大致看看其中的内容和注释。为了说明简单,我们先运行ehcache最基本和简单的例子。配置文件内容如下:<?xml version="1.0" encoding="UTF-8"?><ehcache xmlns:xsi=chema-instance"xsi:noNamespaceSchemaLocation=&

7、quot;ehcache.xsd" updateCheck="false"monitoring="autodetect" dynamicConfig="true"><defaultCache maxEntriesLocalHeap="0" eternal="false"overflowToDisk="true" timeToIdleSeconds="1200" timeToLiveSeconds="1200">

8、;</defaultCache><cache name="sampleCache1" maxEntriesLocalHeap="10000"maxEntriesLocalDisk="1000" eternal="false" overflowToDisk="true"diskSpoolBufferSizeMB="20" timeToIdleSeconds="300" timeToLiveSeconds="600"mem

9、oryStoreEvictionPolicy="LFU" transactionalMode="off" /></ehcache>经过以上步骤操作,我们的工程如下图3.2所示: 图3.23.3 编写测试类新建名为“ehcache”的包。在“ehcache”包下面新建“TestMain.java”类。TestMain.java文件内容使用Junit来编写,所以我们还需要在工程中添加Junit4。TestMain.java的内容很简单,如下:package ehcache;import .URL;import junit.framework

10、.TestCase;import net.sf.ehcache.Cache;import net.sf.ehcache.CacheManager;import net.sf.ehcache.Element;/* * * author ldp * */public class TestMain Testpublic void testF1() throws Exception URL url = TestMain.class.getClassLoader().getResource("conf/ehcache.xml");CacheManager manager = new

11、CacheManager(url);Cache cache1 = manager.getCache("sampleCache1");String key = "key1"String value = key.hashCode() + ""Element element1 = new Element(key, value);cache1.put(element1);System.out.println(cache1.get(key);manager.shutdown();以上是一个很简单的测试类,稍后我们再对代码进行分析。3.4 运行测

12、试类运行上面的TestMain.java类,输出结果如下:3.5 代码解析下面主要对TestMain.java中的testF1()方法进行详细地解析。代码片段1:URL url = TestMain.class.getClassLoader().getResource("conf/ehcache.xml");CacheManager manager = new CacheManager(url);这两行代码根据conf/ehcache.xml配置文件新建出一个CacheManager对象。也就是说,一个ehcache.xml文件就对应一个CacheManager对象,ehc

13、ache.xml中配置的各个缓存,即为该CacheManager对象实际管理和控制的cache对象。代码片段2:Cache cache1 = manager.getCache("sampleCache1");通过CacheManager对象获取其中的指定缓存(sampleCache1)。每个缓存以其name属性来区分。代码片段3:String key = "key1"String value = key.hashCode() + ""新建一个键值对。代码片段4:Element element1 = new Element(key, v

14、alue);cache1.put(element1);System.out.println(cache1.get(key);新建一个Element对象,该对象以刚才的键值对为数据;再将Element对象放入到缓存sampleCache1中;再从缓存sampleCache1中根据键取出存入其中的Element对象。代码片段5:manager.shutdown();关闭CacheManager对象,程序运行结束。4 Ehcache的基本原理通过以上的一个简单的例子,我们已经大体了解了一些Ehcache的原理。接下来,我们再比较详细地了解下Ehcache的原理。4.1 整体结构 Ehcac

15、he的类层次模型主要为三层,最上层的是CacheManager,他是操作Ehcache的入口。我们可以通过CacheManager.getInstance()获得一个单个的CacheManager,或者通过CacheManager的构造函数创建一个新的CacheManager。每个CacheManager都管理着多个Cache。而每个Cache都以一种类Hash的方式,关联着多个Elemenat。而Element则是我们用于存放要缓存内容的地方。Ehcache的整体结构图如下图4.1所示。 图4.1ehcache的刷新策略ehcache的刷新策略是当缓存在放入的时候记录一个放入时间,它是用La

16、zy Evict的方式,在取的时候同设置的TTL比较。ehcache缓存的3种清空策略:Ø FIFO,先进先出Ø LFU,最少被使用,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。Ø LRU,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。事件处理可以为CacheManager添加事件监听,当对CacheManager增删Cache时,事件处理器将会得到通知。要配置事件处理,需要通过ehcache的配置文件来完成。可以为Cache添加事件监听,当对C

17、ache增删Element时,事件处理器将会得到通知。要配置事件处理,需要通过ehcache的配置文件来完成。4.2 CacheManager如上文所述,CacheManager是操作Ehcache的入口。其类结构如下:对于CacheManager,我么重点了解它的构造函数。我们可以有两种模式来创建CacheManager,单例(Singleton)和多例(Instance)。单例创建CacheManager是指通过CacheManager.getInstance()方法或者无参的构造函数CacheManager()创建一个CacheManager对象。这种情况下,系统会在最顶层的classp

18、ath路径下找名叫ehcache.xml的配置文件,如果查找失败,会以包中的ehcache-failsafe.xml文件(里边的缓存配置极其简单)替代。同时,一个警告会提醒用户建立自己的配置文件。测试代码(添加在ehcache-test工程的TestMain.java中,以下同是):Testpublic void testF2() throws Exception CacheManager manager = new CacheManager();manager.addCache("sampleCache1");Cache cache1 = manager.getCache

19、("sampleCache1");String key = "key1"String value = key.hashCode() + ""Element element1 = new Element(key, value);cache1.put(element1);System.out.println(cache1.get(key);manager.shutdown();执行结果如下图4.2所示: 图4.2同时,我们也可以看到,当我们用代码“manager.addCache("sampleCache1");”向C

20、acheManager中加入缓存时,系统会自动用ehcache-failsafe.xml中的<defaultCache>项的配置创建出一个name为“sampleCache1”的cache。多例创建CacheManager的方法和先前的testF1()方法一致。CacheManager支持多种方式创建:Configuration对象、InputStream对象、配置文件路径字符串和URL对象。如果大家有兴趣,都可以去尝试一下。特别地,对于多例创建CacheManager,我们需要指定CacheManager的name属性,系统不允许多个相同name的CacheManager存在;另

21、外,对于一些资源,如当设置了cache内存占用空间满了后,就将缓存数据存放到物理硬盘上(Cache的overflowToDisk属性),每个CacheManager对象的diskStore配置路径不能有重复。关于diskStore的详细配置说明,请参照ehcache.xml模板文件。4.3 Ehcache接口所有的cache都实现此接口,每个cache有自己的name和其他属性,cache中存放Element对象数据。Cache中的Element对象一般存储在MemoryStore里边,我们也可以配置将其存储到DiskStore配置指定的文件路径下边。该接口的结构如下:4.4 ElementE

22、lement对象是存储在cache对象中的最基本元素,主要由键、值和访问记录三部分信息要素构成。如果cache的配置只是让Element存放在MemoryStore中,对Element对象存储的值没有特殊要求;如果cache配置让Element对象存放在DiskStore中,或者在集群环境里cache信息复制时,则要求Element对象存储的值是可序列化的(Serializable)。如果不可序列化的对象被放到DiskStore中,或者集群中复制,则这些信息将被丢失,不会有error产生,只产生debug级别的日志。Element类的结构如下所示:5 集群环境下使用缓存Ehcache支持多种集

23、群环境下的使用。不同的集群环境,ehcache.xml的配置不一样。Ehcache支持以下五种集群方式:l Terracottal RMIl JMSl JGroupsl EhCache Server我们主要看最常用的一种方式:RMI。5.1 RMI 集群模式RMI 是 Java 的一种远程方法调用技术,是一种点对点的基于 Java 对象的通讯方式。EhCache 从 1.2 版本开始就支持 RMI 方式的缓存集群。在集群环境中 EhCache 所有缓存对象的键和值都必须是可序列化的,也就是必须实现 java.io.Serializable 接口,这点在其它集群方式下也是需要遵守的。5.1.1

24、RMI集群模式结构及原理RMI 集群模式的结构如下图5.1所示: 图5.1采用 RMI 集群模式时,集群中的每个节点都是对等关系,并不存在主节点或者从节点的概念,因此节点间必须有一个机制能够互相认识对方,必须知道其它节点的信息,包括主机地址、端口号等。EhCache 提供两种节点的发现方式:手工配置和自动发现。手工配置方式要求在每个节点中配置其它所有节点的连接信息,一旦集群中的节点发生变化时,需要对缓存进行重新配置。由于RMI是Java 中内置支持的技术,因此使用 RMI 集群模式时,无需引入其它的Jar包,Ehcache 本身就带有支持 RMI 集群的功能。使用 RMI 集群模式需要在ehc

25、ache.xml 配置文件中定义 cacheManagerPeerProviderFactory 节点。5.1.2 RMI集群例子我们可以按照以下步骤来进行来完成这个例子:1) 按照第3章相同的方法新建一个java工程ehcache-test-b;我们工作空间工程结构如下图5.2所示: 图5.2(注意:ehcache-test-b工程的测试类名为TestMainB,以方便后续在Eclipse的console里区分)2) 修改ehcache.xml配置文件; 为了保存先前的成果,我们新建一份名为ehcache_cluster.xml的配置文件。 ehcache_cluster.xml配置文件的内

26、容为:<?xml version="1.0" encoding="UTF-8"?><ehcache xmlns:xsi="/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="false"monitoring="autodetect" dynamicConfig="true"><disk

27、Store path="user.home" /><!- 指定除自身之外的网络群体中其他提供同步的主机列表,用“|”分开不同的主机 -><cacheManagerPeerProviderFactoryclass="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"properties="peerDiscovery=manual,rmiUrls=/:60000/UserCache|/:40000/UserCach

28、e" /><!- 配宿主主机配置监听程序,来发现其他主机发来的同步请求 -><cacheManagerPeerListenerFactoryclass="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"properties="port=40000,socketTimeoutMillis=120000" /><!- 默认缓存 -><defaultCache maxElementsInMemory="10000&q

29、uot; eternal="false"timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000"diskPersistent="false" diskExpiryThreadIntervalSeconds="120"memoryStoreEvict

30、ionPolicy="LRU"></defaultCache><!- 缓存 -><cache name="UserCache" maxElementsInMemory="10000" eternal="false"timeToIdleSeconds="100000" timeToLiveSeconds="100000" overflowToDisk="false"><cacheEventListenerFac

31、toryclass="net.sf.ehcache.distribution.RMICacheReplicatorFactory" /><bootstrapCacheLoaderFactoryclass="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"properties="bootstrapAsynchronously=false" /></cache></ehcache> 然后,将ehcache-test工程的ehca

32、che_cluster.xml拷贝一份到ehcache-test-b工程对应目录下;修改ehcache-test-b工程中的ehcache_cluster.xml中的cacheManagerPeerProviderFactory配置项内容为:<!- 配宿主主机配置监听程序,来发现其他主机发来的同步请求 -><cacheManagerPeerListenerFactoryclass="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"properties="port=600

33、00,socketTimeoutMillis=120000" />修改完配置文件后的工程结构如下图5.3所示: 图5.33) 编写java测试方法在ehcache-test工程的TestMain.java文件中添加以下代码:Testpublic void testF3() throws Exception URL url = TestMain.class.getClassLoader().getResource("conf/ehcache_cluster.xml");CacheManager manager = new CacheManager(url);C

34、ache cache1 = manager.getCache("UserCache");String key = "key1"String value = key.hashCode() + ""Element element1 = new Element(key, value);cache1.put(element1);System.out.println(cache1.get(key);manager.shutdown();在ehcache-test-b工程的TestMainB.java文件中添加以下代码:Testpublic vo

35、id testF3() throws Exception URL url = TestMainB.class.getClassLoader().getResource("conf/ehcache_cluster.xml");CacheManager manager = new CacheManager(url);Cache cache1 = manager.getCache("UserCache");while (true) String key = "key1"System.out.println("get value b

36、y aaa");Element element = cache1.get(key);if (element != null) System.out.println(element.getValue();break;Thread.sleep(1000);manager.shutdown();4) 运行测试程序; 先运行ehcache-test-b工程的TestMainB.java文件中testF3()方法,再运行ehcache-test工程的TestMain.java文件中testF3()方法。在正常情况下,不久会,程序就可运行完成。ehcache-test-b工程运行的结果如下图5.

37、4所示: 图5.4ehcache-test工程运行的结果如下图5.5所示: 图5.5我们可以看到,正如我们所说,集群下的缓存数据同步实现了。5.1.3 RMI集群配置文件说明要实现RMI集群环境下缓存数据同步,我们只要修改好缓存配置文件就可以了。配置文件片段1:<!- 指定除自身之外的网络群体中其他提供同步的主机列表,用“|”分开不同的主机 -><cacheManagerPeerProviderFactoryclass="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"prope

38、rties="peerDiscovery=manual,rmiUrls=/:60000/UserCache|/:40000/UserCache" />此段配置定义了网络集群环境中其他提供数据同步的主机声明。Properties属性主要由两个属性,peerDiscovery和rmiUrls。其说明如下:peerDiscovery= automatic:自动发现其他主机;peerDiscovery= manual:指定其他主机列表。当peerDiscovery= automatic时,我们还需要指定以下属性值:multicastGrou

39、pAddress:组播地址;如multicastGroupPort:组播主机端口;如60000timeToLive:组播传播范围;如32当peerDiscovery= manual时,正如上面例子一样,我们只需要列出所有的其他主机列表,例如:rmiUrls=/:60000/UserCache|/:40000/UserCache为了配置方便,我们可以把本机也配置在主机列表中,如例子所示。配置文件片段2:<!- 配宿主主机配置监听程序,来发现其他主机发来的同步请求 -><cacheManagerPeerListenerFactoryclass=

40、"net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"properties="port=40000,socketTimeoutMillis=120000" />正如注释描述的,此处申明本机的ip和端口号,以使得其他主机能发现本机。Properties可以配置的属性如下:hostName:主机ip;port:主机端口号;如60000socketTimeoutMillis:socket超时时间设置;如120000配置文件片段3:<!- 缓存 -><cache name="UserCache" maxElementsInMemory="10000" eternal="false"timeToIdleSeconds="

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论