为了使用Ehcache,你需要配置CacheManager和Cache,有两种方式可以配置java编程配置或者XML文件配置

一. 通过java编程配置

CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder() (1)
.withCache("preConfigured",
CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(10))) (2)
.build(); (3)
cacheManager.init(); (4) Cache<Long, String> preConfigured =
cacheManager.getCache("preConfigured", Long.class, String.class); (5) Cache<Long, String> myCache = cacheManager.createCache("myCache", (6)
CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(10))); myCache.put(1L, "da one!"); (7)
String value = myCache.get(1L);(8) cacheManager.removeCache("preConfigured"); (9) cacheManager.close();(10)

(1). 这个静态方法org.ehcache.config.builders.CacheManagerBuilder.newCacheManagerBuilder返回一个新的org.ehcache.config.builders.CacheManagerBuilder实例。

(2). 通过使用CacheManagerBuilder去定义一个名为"preConfigured"的Cache,当cacheManager.build()被调用时这个Cache才会被真正的创建。第一个String参数是Cache的名字,用来从CacheManager中获取Cache的,第二个参数org.ehcache.config.CacheConfiguration是用来配置Cache的,我们使用静态方法newCacheConfigurationBuilder()来创建一个默认的配置。

(3). 最后调用build()返回一个CacheManager实例,但是该实例还没有初始化。

(4). 在使用CacheManager之前需要初始化,有两种方法,一种是调用CacheManager.init(),或者是在调用CacheManagerBuilder.build(boolean init)时使用带参数的方法并且设置成true。

(5). 向CacheManager传入cache name,keyType,valueType来获取一个cache。例如为了获取在第二步定义的cache你需要这样设置alias="preConfigured"keyType=Long.class and valueType=String.class,为了type-safety我们要求两个参数keyType和valueType都传入。如果我们设置的不对,CacheManager会尽早地抛出ClassCastException异常,这样可以防止Cache被随机类型污染。

(6). CacheManager可以创建一个新的Cache,像步骤二那样,他需要传入一个Cache名和一个Cache配置。通过CacheManager.getCache方法可以获取到已经初始化之后的Cache实例。

(7). 现在新添加的cache可以用来储存entries,entries包含了key-value的键值对。put方法的第一个参数是key,第二个参数是value,key和value的类型一定要和CacheConfiguration中定义的一样,除此之外这个cache中的key一定是唯一的,并且只能对应一个value。

(8). 通过cache.get(key)获取value,这个方法只有一个参数key,并且返回这个key关联的value,如果这个key没有关联的value那么就返回null.

(9). 我们可以使用CacheManager.removeCache(String)删除一个给定的cache,CacheManager不仅会删除对Cache的引用,而且还会关闭该Cache,那么Cache会释放本地占用的临时资源如(memory)。Cache的引用也将不可用了。

(10). 为了释放所有的临时资源(memory,threads),CacheManager给Cache实例提供了管理方法,你必须调用CacheManager.close()方法,他会依次的关闭所有存在的Cache实例。

下面给出针对上面代码的一个简短版本,主要涉及三个重要的事情

try(CacheManager cacheManager = newCacheManagerBuilder() (1)
.withCache("preConfigured", newCacheConfigurationBuilder(Long.class, String.class, heap(10))) (2)
.build(true)) { (3) // Same code as before [...]
}

(1). A CacheManager implements Closeable so can be closed automatically by a try-with-resources. A CacheManager must be closed cleanly. In a finally block, with a try-with-resources or (more frequent for normal applications) in some shutdown hook.

(2). Builders having different names, you can use static imports for all of them.

(3). CacheManager通过build(true)进行了初始化。

二. 通过XML进行配置

<config
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns='http://www.ehcache.org/v3'
xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core.xsd"> <cache alias="foo"> (1)
<key-type>java.lang.String</key-type>(2)
<value-type>java.lang.String</value-type>(2)
<resources>
<heap unit="entries">20</heap> (3)
<offheap unit="MB">10</offheap> (4)
</resources>
</cache> <cache-template name="myDefaults"> (5)
<key-type>java.lang.Long</key-type>
<value-type>java.lang.String</value-type>
<heap unit="entries">200</heap>
</cache-template> <cache alias="bar" uses-template="myDefaults"> (6)
<key-type>java.lang.Number</key-type>
</cache> <cache alias="simpleCache" uses-template="myDefaults" />(7) </config>

(1). 定义cache的名字为foo

(2). foo的key和value类型被定义为String,如果没有指定类型,那么默认为java.lang.Object。

(3). foo在堆中可以存储20个entries

(4). 10M的堆外空间

(5). <cache-template>元素可以让你定义一个配置模板,然后被继承。

(6). bar就是继承名字为"myDefaults"的<cache-template>的一个cache,并且重写了模板中key-type。

(7). simpleCache是另一个继承myDefault的Cache,它完全使用myDefaults中的配置作为自己的配置。

三. 解析XML配置

为了解析XML配置,你可以使用XmlConfiguration类型:

URL myUrl = getClass().getResource("/my-config.xml"); (1)
Configuration xmlConfig = new XmlConfiguration(myUrl); (2)
CacheManager myCacheManager = CacheManagerBuilder.newCacheManager(xmlConfig); (3)

(1). 获取XML文件的url地址。

(2). 通过传入XML文件的url地址,去实例化一个XmlConfiguration。

(3). 使用静态方法CacheManagerBuilder.newCacheManager(xmlConfig)去创建CacheManager实例。

 四.创建集群模式的CacheManager

为了使用Terracotta(收购了Ehcache和Quartz)的集群模式,首先你要以集群存储模式启动Terracotta服务,除此之外为了创建集群模式的CacheManager,你需要提供集群配置如下:

CacheManagerBuilder<PersistentCacheManager> clusteredCacheManagerBuilder =
CacheManagerBuilder.newCacheManagerBuilder() (1)
.with(ClusteringServiceConfigurationBuilder.cluster(URI.create("terracotta://localhost/my-application")) (2)
.autoCreate()); (3)
PersistentCacheManager cacheManager = clusteredCacheManagerBuilder.build(true); (4) cacheManager.close(); (5)

(1). 返回一个CacheManagerBuilder实例

(2). 使用静态方法.cluster(URL),连接了CacheManager和ClusteringStorage,并且该方法返回了集群服务配置的实例,在上面这个例子中提供了一个简单的URI,用来指定在Terracotta服务上的集群存储标识my-application(假设Terracotta这个服务已经在本地的9410端口运行),参数auto-create表示如果如果不存在那么就创建这个集群存储。

(3). Returns a fully initialized cache manager that can be used to create clustered caches.

(4). Auto-create the clustered storage if it doesn't already exist.

(5). 关闭CacheManager。

五. 分层存储

Ehcache 3和之前的版本一样,支持分层模型,允许在较慢的层中存储更多的数据(通常情况下较慢的层存储空间更大)。

这个分层的理念是,支持快速存储的资源很稀缺,所以HotData优先放到该区域。那些访问频率很少的数据被移到慢存储层上。

三层存储结构,堆空间,堆外空间,磁盘空间。

一个使用三层存储的典型例子如下

PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder()
.with(CacheManagerBuilder.persistence(new File(getStoragePath(), "myData"))) (1)
.withCache("threeTieredCache",
CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class,
ResourcePoolsBuilder.newResourcePoolsBuilder()
.heap(10, EntryUnit.ENTRIES) (2)
.offheap(1, MemoryUnit.MB) (3)
.disk(20, MemoryUnit.MB, true)(4)
)
).build(true); Cache<Long, String> threeTieredCache = persistentCacheManager.getCache("threeTieredCache", Long.class, String.class);
threeTieredCache.put(1L, "stillAvailableAfterRestart"); (5) persistentCacheManager.close();

(1). 如果你想使用磁盘存储(像持久化Cache那样),你需要提供一个数据存储的路径给.persistence()静态方法。

(2). 定义一个heap,这块空间是最快速存储的但是空间小。

(3). 定义一个off-heap,这块空间也是快速的但是空间比上面的大。

(4). 定义一个磁盘持久化存储。

(5). 当JVM重启时(假如CacheManager已经关闭了),cache中的数据也是可以获得的。

 六. 数据新鲜度

在Ehcache中,数据的新鲜度由Expiry来控制,下面举例说明如何配置一个time-to-live expirly。

CacheConfiguration<Long, String> cacheConfiguration = CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class,
ResourcePoolsBuilder.heap(100)) (1)
.withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(20))) (2)
.build();

(1). Expiry是在cache级别配置的,所以先定义一个cache配置。

(2). 然后添加一个Expiry,这里使用的是预定义的time-to-live,他需要一个Duration参数。

Ehcache 3.7文档—基础篇—GettingStarted的更多相关文章

  1. Ehcache 3.7文档—基础篇—XML Configuration

    你可以使用xml配置创建CacheManager,根据这个schema definition ( http://www.ehcache.org/documentation/3.7/xsds.html# ...

  2. Ehcache 3.7文档—基础篇—JCache aka JSR-107

    一. 概述JCache Java临时缓存API(JSR-107),也被称为JCache,它是一个规范在javax.cache.API中定义的.该规范是在Java Community Process下开 ...

  3. Ehcache 3.7文档—基础篇—Tiering Options

    Ehcache支持分层缓存的概念,这节主要介绍不同的配置选项,同时也解释了规则和最佳实践. 一. 数据缓存到堆外 当在cache中除了有heap层之外,有一些需要注意的: 添加一个key-value到 ...

  4. Mongoose学习参考文档——基础篇

    Mongoose学习参考文档 前言:本学习参考文档仅供参考,如有问题,师请雅正 一.快速通道 1.1 名词解释 Schema : 一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力 Model ...

  5. XWPFDocument创建和读取Office Word文档基础篇(一)

    注:有不正确的地方还望大神能够指出,抱拳了 老铁!   参考API:http://poi.apache.org/apidocs/org/apache/poi/xwpf/usermodel/XWPFDo ...

  6. java 使用 POI 操作 XWPFDocumen 创建和读取 Office Word 文档基础篇

    注:有不正确的地方还望大神能够指出,抱拳了 老铁! 参考 API:http://poi.apache.org/apidocs/org/apache/poi/xwpf/usermodel/XWPFDoc ...

  7. TypeScript学习文档-基础篇(完结)

    目录 TypeScript学习第一章:TypeScript初识 1.1 TypeScript学习初见 1.2 TypeScript介绍 1.3 JS .TS 和 ES之间的关系 1.4 TS的竞争者有 ...

  8. HTML文档基础

    一.HTML(Hyper Text Markup Language超文本标记语言)是一种用来制作超文本文档的简单标记语言,HTML在正文的文本中编写各种标记,通过Web浏览器进行编译和运行才干正确显示 ...

  9. Excelize 发布 2.6.0 版本,功能强大的 Excel 文档基础库

    Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准.可以使用它来读取.写入由 Microsoft Exc ...

随机推荐

  1. P5290 [十二省联考2019]春节十二响

    题目地址:P5290 [十二省联考2019]春节十二响 骗分方法 如果你实在一点思路也没有,暴力都不会打,那么请考虑一下骗分. 方法一 输出所有 \(M\) 的和. 期望得分:0分. 实际还有5分 方 ...

  2. Re-enable extensions not coming from Chrome Web Store on Chrome v35+ (with enhanced security)

    1. Add the --enable-easy-off-store-extension-install flag when you start chrome (create shortcut, ed ...

  3. Linux 虚拟机上安装linux系统 (ip:子网掩码,网关,dns,交换机,路由知识回顾)

    一 安装虚拟机 二 虚拟机上配置好在安装linux系统 三 知识回顾 交换机:主机在局域网内的身份是MAC地址(可以通过[交换机广播:交换机通过被动学习来建立一张“接口号”和“MAC地址”的对照表]或 ...

  4. Copley-STM32串口+CANopen实现双电机力矩同步

    原来有个CANopen的主站卡,现在没了,只有单片机,用单片机来制作一个CANopen的主站卡貌似不是很难,但是需要时间.无奈仔细看了一个Copley的说明,决定采用CAN口+串口来实现之前的功能. ...

  5. 【原创】大叔问题定位分享(27)spark中rdd.cache

    spark 2.1.1 spark应用中有一些task非常慢,持续10个小时,有一个task日志如下: 2019-01-24 21:38:56,024 [dispatcher-event-loop-2 ...

  6. 初学python之路-day01

    第一天学习python,先了解到了进制之间的转换关系. 如二进制与十进制的转换,如1111转成十进制为15,1111从左向右可看出2^3+2^2+2^1+2^0为8+4+2+1=15.记住前8位1的二 ...

  7. Team Queue (HDU:1387)

    Queues and Priority Queues are data structures which are known to most computer scientists. The Team ...

  8. Excel VBA入门(8): 代码调试/错误处理/代码优化

    VBE有丰富的调试工具, 比如立即窗口, 本地窗口, 监视窗口, 断点调试... 第一个博文中已经讲过调试的基本操作: 设置断点, F5运行, F8逐条运行 断点就是程序中暂停停止运行的位置, 设置断 ...

  9. bzoj 3238

    后缀数组+单调栈的应用 首先我们研究一下这个表达式,可以发现前半部分与串的情况并没有关系,而只是跟串的长度有关,所以我们先把前半部分算出来: 于是我们只需计算出即可 那么可以发现,对于排名分别为i,j ...

  10. Python学习笔记六

    Python课堂笔记六 常用模块已经可以在单位实际项目中使用,可以实现运维自动化.无需手工备份文件,数据库,拷贝,压缩. 常用模块 time模块 time.time time.localtime ti ...