Ehcache(01)——简介、基本操作

http://haohaoxuexi.iteye.com/blog/2112170

目录

1       CacheManager

1.1      构造方法构建

1.2      静态方法构建

2       Cache

2.1      Cache的创建

Ehcache是用来管理缓存的一个工具,其缓存的数据可以是存放在内存里面的,也可以是存放在硬盘上的。其核心是CacheManager,一切Ehcache的应用都是从CacheManager开始的。它是用来管理Cache(缓存)的,一个应用可以有多个CacheManager,而一个CacheManager下又可以有多个Cache。Cache内部保存的是一个个的Element,而一个Element中保存的是一个key和value的配对,相当于Map里面的一个Entry。

1       CacheManager

CacheManager是Ehcache的核心,它的主要职责是对Cache的创建、移除和访问。只有CacheManager里面的Cache才能实现缓存数据的功能。一切使用Ehcache的应用都是从构建CacheManager开始的。构建CacheManager时,我们可以直接通过其构造方法来进行构建,也可以通过使用CacheManager提供的静态方法来进行构建。

1.1     构造方法构建

使用构造方法构建CacheManager时每次都会产生一个新的CacheManager对象,并且会以该CacheManager对应的name作为key保存该CacheManager。当我们在构建CacheManager时如果已经存在name相同正在使用的CacheManager,则会抛出异常。此外,当多个CacheManager对应的storePath相同时,则它们存放在磁盘上包含缓存信息的文件将会相互覆盖。

1.使用默认配置

当我们使用CacheManager的无参构造方法来构造CacheManager时就是使用的默认配置。这种情况最终还是会寻找默认的配置文件进行配置。Ehcache首先会到类根路径下寻找一个叫ehcache.xml的配置文件来配置CacheManager,如果没有找到该文件,则会加载CacheManager的默认配置ehcache-failsafe.xml文件,这个文件是在ehcache.jar里面的。关于配置文件如何配置的问题将在后续的文章中再做一个详细的讲解,这里先来简单看一个配置文件。

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">  

   <cache name="test" maxBytesLocalHeap="10M"/>  

</ehcache>

每一个配置文件的根元素都是ehcache,在该元素上可以指定一些CacheManager级别的参数。ehcache元素下的每一个cache元素代表一个缓存定义。cache元素上可以指定一些Cache级别的属性。下面是一个使用默认配置构建CacheManager的示例。

@Test
public void testDefault() {
   CacheManager cacheManager = new CacheManager();
   //输出当前cacheManager正在使用的配置对应的Xml格式文本
   System.out.println(cacheManager.getActiveConfigurationText());
}

2.以Configuration作为参数

Configuration是用来指定CacheManager配置信息的,其它通过不同的方式所指定的构造参数最终都会转化为一个对应的Configuration对象,然后再利用该Configuration对象初始化CacheManager。

@Test
public void test() {
   //新建一个CacheManager的配置信息
   Configuration configuration = new Configuration();
   //新建一个缓存的配置信息
   CacheConfiguration cacheConfiguration = new CacheConfiguration().name("test");
   //指定当前缓存的最大堆内存值为100M
   cacheConfiguration.maxBytesLocalHeap(100, MemoryUnit.MEGABYTES);
   //添加一个cache
   configuration.addCache(cacheConfiguration);
   configuration.dynamicConfig(false);  //不允许动态修改配置信息
   CacheManager cacheManager = new CacheManager(configuration);
   Cache cache = cacheManager.getCache("test");
   cache.put(new Element("test", "test"));
   System.out.println(cache.get("test").getObjectValue());;
}

3.以xml格式的配置对应的InputStream作为参数

通过Xml格式的配置对应的InputStream作为参数时,Ehcache会对Xml进行解析,然后构造一个对应的Configuration对象。

public void testInputStream() throws IOException {
   InputStream is = this.getClass().getClassLoader().getResourceAsStream("/ehcache.xml");
   CacheManager cacheManager = new CacheManager(is);
   is.close();
   System.out.println(cacheManager.getActiveConfigurationText());
}

4.以xml格式的配置文件对应的路径作为参数

指定xml格式的配置文件对应的路径后,Ehcache会获取指定路径对应的配置文件,然后获取其输入流,再利用InputStream的方式构造CacheManager。这里的路径可以是相对路径,也可以是绝对路径。

@Test
public void testXmlPath() {
   //这个文件路径可以是相对路径,也可以是绝对路径。这里使用的是相对路径。
   CacheManager cacheManager = new CacheManager("src/main/resources/ehcache/ehcache.xml");
   System.out.println(cacheManager.getActiveConfigurationText());
}

5.以xml格式的配置对应的URL作为参数

以URL作为参数时,实际上ehcache还是通过获取URL对应的InputStream,然后再利用该InputStream以InputStream构造CacheManager的方式进行CacheManager的构造。

@Test
public void testURL() {
   URL url = this.getClass().getResource("/ehcache.xml");
   CacheManager cacheManager = new CacheManager(url);
   System.out.println(cacheManager.getActiveConfigurationText());
}

1.2     静态方法构建

在CacheManager内部定义了一系列的用于构建CacheManager对象的静态方法。这主要可以分为两大类,一类是通过create()方法及其重载方法构建的,一类是通过newInstance()方法及其重载方法构建的。create()方法构建的都是单例,而newInstance()方法构建的可能是单例,也可能是多例。在CacheManager内部持有一个CacheManager类型的singleton对象,每次我们调用create()方法及其重载方法时,Ehcache都会判断当前的singleton对象是否非空,如果非空则直接返回,否则则以相应的配置构建一个CacheManager对象赋给singleton并进行返回。在调用newInstance()方法及其重载方法构建CacheManager时,Ehcache首先会判断我们之前是否创建过且还存在同样名称的CacheManager对象,如果有则直接返回该CacheManager对象,否则将新建一个CacheManager进行返回。所以调用CacheManager的newInstance()系列方法构建CacheManager与直接调用CacheManager的构造方法构造CacheManager对象的区别就在于调用newInstance()系列方法时如有同名的存在,会直接返回先前的,而不会抛出异常。此外CacheManager内部还定义了一个getInstance()静态方法,调用它时相当于是调用了不带参数的create()方法。

1.create()方法

在CacheManager内部一共定义有五个create()方法,分别对应于CacheManager的五个newInstance()方法,而每一个newInstance()方法又对应于CacheManager对应的构造方法。在调用时Ehcache会先判断CacheManager内部持有的singleton是否为空,非空则直接返回singleton,否则将返回对应参数的newInstance()返回的实例对象并赋值给singleton。

public void test() {
   //以默认配置创建一个CacheManager单例
   CacheManager cacheManager = CacheManager.create();  

   //以config对应的配置创建CacheManager单例
   Configuration config = ...;//以某种方式获取的Configuration对象
   cacheManager = CacheManager.create(config);  

   //以configurationFileName对应的xml文件定义的配置创建CacheManager单例
   String configurationFileName = ...;//xml配置文件对应的文件名称,包含路径
   cacheManager = CacheManager.create(configurationFileName);  

   //以is对应的配置信息创建CacheManager单例
   InputStream is = ...; //以某种方式获取到的Xml配置信息对应的输入流
   cacheManager = CacheManager.create(is);  

   //以URL对应的配置信息创建CacheManager单例
   URL url = ...;  //以某种方式获取到的Xml配置信息对应的URL
   cacheManager = CacheManager.create(url);
}


2.newInstance()
方法

在CacheManager内部一共定义有五个newInstance()方法,分别对应于CacheManager的五个构造方法。在调用newInstance()方法时,Ehcache会查看CacheManager内部是否保存有曾经新建的且同名的CacheManager,如果有则返回该对象,否则构建一个新的CacheManager对象进行返回。所以newInstance()方法并不一定会产生一个新的对象。

public void test() {
   //以默认配置创建一个CacheManager
   CacheManager cacheManager = CacheManager.newInstance();  

   //以config对应的配置创建CacheManager
   Configuration config = ...;//以某种方式获取的Configuration对象
   cacheManager = CacheManager.newInstance(config);  

   //以configurationFileName对应的xml文件定义的配置创建CacheManager
   String configurationFileName = ...;//xml配置文件对应的文件名称,包含路径
   cacheManager = CacheManager.newInstance(configurationFileName);  

   //以is对应的配置信息创建CacheManager
   InputStream is = ...; //以某种方式获取到的Xml配置信息对应的输入流
   cacheManager = CacheManager.newInstance(is);  

   //以URL对应的配置信息创建CacheManager
   URL url = ...;  //以某种方式获取到的Xml配置信息对应的URL
   cacheManager = CacheManager.newInstance(url);
}

1.3     CacheManager的关闭

当我们不再需要使用CacheManager的时候,我们需要将CacheManager进行关闭。Ehcache为我们提供了一个关闭CacheManager的钩子,默认情况下是不可用的,通过设置系统属性net.sf.ehcache.enableShutdownHook=true就可以将该功能打开。但是官方还是推荐我们在程序里面调用CacheManager的shutdown()方法来将当前CacheManager进行关闭。

2       Cache

在Ehcache中定义了一个对缓存进行处理的接口叫Ehcache,Cache是Ehcache的一个实现类。Cache是由CacheManager进行管理的,使用CacheManager生成的就是一个Cache对象。Cache里面保存的是一个个的Element对象,这些对象通常都是保存在MemoryStore里面的,但也可以溢出到DiskStore。Element里面存放的是一个key和value的配对,其中key和value都是Object。Cache的创建可以事先在创建CacheManager的时候定义好,也可以在之后调用CacheManager实例的相关方法进行Cache的添加。Cache是线程安全的。

@Test
public void test() {
   CacheManager cacheManager = CacheManager.create();
   //以默认配置添加一个名叫cacheName的Cache。
   cacheManager.addCache("cacheName");
   Cache cache = cacheManager.getCache("cacheName");
   Element ele = new Element("key", "value");
   //把ele放入缓存cache中
   cache.put(ele);
}

2.1     Cache的创建

Cache的创建主要有两种方式,一种是通过Cache的构造方法创建,另一种是通过CacheManager创建。Cache中定义了一系列的构造方法,这里我们拿常用的利用CacheConfiguration来构造Cache做个示例。

@Test
public void cache() {
   //内存中保存的Element的最大数量
   int maxEntriesLocalHeap = 10000;
   CacheConfiguration cacheConfiguration = new CacheConfiguration("cacheName", maxEntriesLocalHeap);
   cacheConfiguration.overflowToOffHeap(false);
   Cache cache = new Cache(cacheConfiguration);
   //使用默认配置创建CacheManager
   CacheManager cacheManager = CacheManager.create();
   //只有添加到CacheManager中的Cache才是有用的
   cacheManager.addCache(cache);
   cache.put(new Element("key", "value"));
   System.out.println(cache.get("key"));
}

注意:通过使用Cache的构造方法直接new出来的Cache一定要添加到CacheManager中才能使用。

通过CacheManager创建的Cache是指我们把Cache定义在CacheManager对应的配置信息里面,这样在创建CacheManager的时候也会把其中定义的Cache进行实例化并添加到对应的CacheManager中。根据构建CacheManager的方式不同,我们把Cache定义在CacheManager的配置信息中的方式也不同。总的来说有两种方式,一种是定义的对应的Xml格式的配置信息中,另一种是通过Configuration构建CacheManager时把CacheConfiguration添加到Configuration中。在之前介绍CacheManager的时候我们已经提到了在Ehcache配置文件中每一个cache元素代表一个Cache定义。简单示例如下:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">  

   <cache name="test" maxBytesLocalHeap="10M"/>  

</ehcache>

通过Configuration构建CacheManager时我们只需要把Cache定义即CacheConfiguration添加到Configuration中即可,示例代码如下:

@Test
public void cache2() {
   CacheConfiguration cacheConfiguration = new CacheConfiguration();
   cacheConfiguration.setName("test");  //指定cache名称
   cacheConfiguration.setMaxBytesLocalHeap("10M");   //指定最大可用堆内存
   Configuration config = new Configuration(); //构建一个空配置
   //添加Cache配置信息到CacheManager的配置信息中
   config.addCache(cacheConfiguration);
   CacheManager cacheManager = CacheManager.create(config);
   System.out.println(cacheManager.getOriginalConfigurationText());
   Cache cache = cacheManager.getCache("test");
   cache.put(new Element("key", "value"));
}

2.2     Cache内容的CRUD

Cache内容的CRUD是指对Cache中保存的元素进行CRUD操作。

(1)新增元素

新增元素可以通过Cache的put(Element ele)方法来进行。Element是键值对形式,我们真正想要缓存的其实是Element的value,但是我们可以通过key来区别不同的value。同时Element中还包括我们缓存的一些额外信息,如缓存的时间等。Element的key和value类似于Map的key和value,均可为Object对象。

public class CacheCRUDTest {  

   private CacheManager cacheManager;  

   @Before
   public void before() {
      cacheManager = CacheManager.create();
      cacheManager.addCache("cache");
   }  

   @After
   public void after() {
      cacheManager.shutdown();
   }  

   /**
    * 往Cache中新增元素
    */
   @Test
   public void create() {
      Cache cache = cacheManager.getCache("cache");
      Element ele = new Element("key", "value");
      //把ele放入缓存cache中
      cache.put(ele);
   }  

}

(2)获取元素

获取元素的时候我们可以通过Cache的get()方法来进行的,其接收的参数是元素的key。

/**
 * 从Cache中读取元素
 */
@Test
public void read() {
   Cache cache = cacheManager.getCache("cache");
   //通过key来获取缓存中对应的元素
   Element ele = cache.get("key");
   System.out.println(ele);
   if (ele != null) {//当缓存的元素存在时获取缓存的值
      System.out.println(ele.getObjectValue());
   }
}

(3)更新元素

当我们在往Cache里面put元素的时候,如果Cache中已经存在相同key的元素了,则会用新的元素替换旧的元素,这也就意味着之前元素的一些信息将会丢失,如被查到的次数hitCount和创建时间等。

/**
 * 更新元素
 */
@Test
public void update() {
   Cache cache = cacheManager.getCache("cache");
   cache.put(new Element("key", "value1"));
   System.out.println(cache.get("key"));
   //当添加元素的时候,如果缓存中已经存在相同key的元素则会将后者覆盖前者
   cache.put(new Element("key", "value2"));
   System.out.println(cache.get("key"));
}

此外,使用Cache的replace(Element ele)方法也可以更新Cache中对应的元素。与直接put更新不同的是,replace只会在Cache中拥有相同key的元素时才会对之前的元素进行更新。replace也会覆盖之前元素信息。

/**
 * 更新元素
 */
@Test
public void update() {
   Cache cache = cacheManager.getCache("cache");
   cache.put(new Element("key", "value1"));
   System.out.println(cache.get("key"));
   //替换元素的时候只有Cache中已经存在对应key的元素时才会替换,否则不操作。
   cache.replace(new Element("key", "value2"));
   System.out.println(cache.get("key"));
}

(4)删除元素

删除元素是通过Cache的remove()方法进行的,其接收所要删除元素的key作为参数。

/**
 * 根据key来移除一个元素
 */
@Test
public void delete() {
   Cache cache = cacheManager.getCache("cache");
   //根据key来移除一个元素
   cache.remove("key");
   System.out.println(cache.get("key"));
}

(本文是基于Ehcache2.8.1写的)

时间: 2024-10-21 18:43:40

Ehcache(01)——简介、基本操作的相关文章

ehcache.xml简介

这是从网上找的一片关于ehcache.xml的简介 ehcache.xml简介 ehcache.xml文件是用来定义Ehcache的配置信息的,更准确的来说它是定义CacheManager的配置信息的.根据之前我们在<Ehcache简介>一文中对CacheManager的介绍我们知道一切Ehcache的应用都是从CacheManager开始的.在不指定配置信息参数创建CacheManager时,CacheManager将首先在类路径的根目录下寻找一个叫ehcache.xml的文件作为Cache

Node.js 教程 01 - 简介、安装及配置

目录: Node.js 教程 01 - 简介.安装及配置 Node.js 教程 02 - 经典的Hello World Node.js 教程 03 - 创建HTTP服务器 简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好. 谁适合阅读本教程?

Ehcache(02)——ehcache.xml简介

http://haohaoxuexi.iteye.com/blog/2113728 ehcache.xml简介 ehcache.xml文件是用来定义Ehcache的配置信息的,更准确的来说它是定义CacheManager的配置信息的.根据之前我们在<Ehcache简介>一文中对CacheManager的介绍我们知道一切Ehcache的应用都是从CacheManager开始的.在不指定配置信息参数创建CacheManager时,CacheManager将首先在类路径的根目录下寻找一个叫ehcac

ITEXT 使用详解-01 简介与安装

1pdf简介 2为什么使用itext 现在网页大多提供下载,自动生成pdf 表单的功能. itext 这个api 很好的解决对pdf处理的难题. 简化了对pdf的处理. itext 就是一个用于创建,修改,生成pdf的一个JAVA 组件.可以通过这个itext jar 用于显示报表,修改pdf 内容,通过java 代码自动填充报表等一系列功能. 3 安装 1,首先下载这个itext jar 文件.下载链接如下 http://sourceforge.net/projects/itext/files

ElasticSearch学习笔记-01 简介、安装、配置与核心概念

一.简介 ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎.设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便.支持通过HTTP使用JSON进行数据索引. Lucene只是一个框架,要利用它的功能,需要使用JAVA,并且在程序中集成Lucene.更糟的是,Lucene非常复杂,需要做很多的学习了解,才能明白它是如何运行的. Elasticsearch使用Lucene作为内部引擎,但是在使用它做全文搜索时,只需要使用统一开发好的API即可,

Power BI基础系列-01简介篇

Power BI是一套商业分析软件,它可以连接数百个数量源.简化数据准备并提供即席查询,即席查询(Ad Hoc)是用户根据自己的需求,灵活地选择查询条件,系统可以根据用户选择的条件生成对应的报表. Power BI简介 Power BI 是Microsoft公司自主研发发布的最新可视化工具,它结合了Power Query.Power Privot.Power View和Power Map等一系列工具的经验成果.最重要的是它可以将我们在Excel里的数据通过报表的形象呈现给用户,并且在Excel

Java单体应用 - Markdown - 01.简介

原文地址:http://www.work100.net/training/monolithic-markdown.html 更多教程:光束云 - 免费课程 简介 序号 文内章节 视频 1 概述 2 特性 3 用途 请参照如上章节导航进行阅读 1.概述 Markdown 是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. 2.特性 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档 语言在 2004 由约翰·格鲁伯(英语:John G

Sterling B2B Integrator与SAP交互 - 01 简介

公司近期实施上线了SAP系统,由于在和客户的数据交互中采用了较多的EDI数据交换,且多数客户所采用的EDI数据并不太相同(CSV,XML,X12,WebService),所以在EDI架构上选择了IBM产品Sterling B2B Integrator作为中间件把数据统一转换SAP IDOC格式与之交互. 简单来讲可以分成二部分: Inbound:Sterling拿到客户数据文件后转换成SAP的EDI IDOC格式,SAP接收IDOC入系统. Outbound:SAP系统处理完数据后发送IDOC给

01.简介

1.  什么是 AngularJS - 一款非常优秀的前端高级 JS 框架 - 最早由 Misko Hevery 等人创建 - 2009 年被 Google 公式收购,用于其多款产品 - 目前有一个全职的开发团队继续开发和维护这个库 - 有了这一类框架就可以轻松构建 SPA 应用程序 - 轻松构建 SPA(单一页面应用程序) - 单一页面应用程序: + 只有一个页面(整个应用的一个载体) + 内容全部是由AJAX方式呈现出啦的 - 其核心就是通过指令扩展了 HTML,通过表达式绑定数据到 HTM

SQL Server LocalDB 学习笔记 01 简介

SQL Server 2012 新增产品 SQL Sever Express轻量级版本 转为开发人员创建 无需管理 兼用T-SQL语言 编程接口与SQL Server Express一样 适用于小型应用环境.嵌入式环境 好处:无需再笔记本安装维护一个庞大的SQL Server实例了. 特性: 兼容其他SQL Server版本,使用sqlservr.exe作为服务进程,使用相同的客户端访问接口,兼容T-SQL编程语言. 无需安装多个LocalDB,不同程序可以并行执行多个LocalDB进程,所有的