ehcache的学习笔记(一)
学习ehcache文档:
介绍:Ehcache是一个开源的项目,用来提高性能的基于标准化的缓存,无需使用数据库,简化了可扩展性。他是最广泛使用的基于java的缓存,因为他是强壮的,被证实的,功能全面的,并且可以和其他的流行的库和框架整合。Ehcache从进程内到进程内外以TB级的缓存混合部署。
目前最新的可用版本是:3.7。这个版本增加了堆上的性能。需要使用java8+。在接下来的几个月里可以看到3.x系列的功能的持续快速的改进。
Ehcache3介绍:
- 改进了使用java泛型的API以及简化了缓存的交互,
- 完全兼容了javax.cache API,
- 离堆存储能力,包括离堆缓存
- 由于javax.cache的支持,对spring缓存和hibernate集成是开箱即用的,等等。。。
开始使用Ehcache3
引入Ehcache到项目里,要么使用他的最新的API,也可以使用javax.cache API。
使用 the core Ehcache v3 API,Ehcache 3有一个流线型的、现代化的类型安全API(和配置),与Ehcache 2.x相比,它将极大地改善您的编码体验。
引入jars
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.7.0</version>
</dependency>
使用Ehcache 3 API:
CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()
.withCache("preConfigured",
CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class,
ResourcePoolsBuilder.heap(100))
.build())
.build(true); Cache<Long, String> preConfigured
= cacheManager.getCache("preConfigured", Long.class, String.class); Cache<Long, String> myCache = cacheManager.createCache("myCache",
CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class,
ResourcePoolsBuilder.heap(100)).build()); myCache.put(1L, "da one!");
String value = myCache.get(1L); cacheManager.close();
除了上面的,还需要the JSR-107 API,导入jars
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
<version>1.1.0</version>
</dependency>
文档:
配置Ehcache:java配置可以通过提供一个API来很容易的得到。和以前的版本一样,处理cache最权威的方式是通过一个CacheManage。
CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()
.withCache("preConfigured",
CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(10)))
.build();
cacheManager.init(); Cache<Long, String> preConfigured =
cacheManager.getCache("preConfigured", Long.class, String.class); Cache<Long, String> myCache = cacheManager.createCache("myCache",
CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(10))); myCache.put(1L, "da one!");
String value = myCache.get(1L); cacheManager.removeCache("preConfigured"); cacheManager.close();
1.CacheManagerBuilder.newCacheManagerBuilder(),org.ehcache.config.builders.CacheManagerBuilder.newCacheManagerBuilder这个静态方法返回了一个新的org.ehcache.config.builders.CacheManagerBuilder的实例。
2..withCache("preConfigured",CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(10))) ,使用这个builder去定义一个叫“preConfigured”的缓存。当在CacheManager实例上,cacheManager.build()被调用时,这个缓存将被创建。第一个string参数是缓存的别名,他被用于从CacheManager来检索缓存。第二个参数org.ehcache.config.CacheConfiguration被用来配置这个缓存。我们在rg.ehcache.config.builders.CacheConfigurationBuilder上使用newCacheConfigurationBuilder()静态方法来创建一个默认的配置。
3..build(),最后调用build()返回了一个完全实例化但是还没有初始化的CacheManager。
4.cacheManager.init(),使用CacheManager之前,他需要被初始化,可以使用两种方式的一种:在CacheManager实例上调用CacheManager.init()或者调用CacheManagerBuilder.build(boolean init)方法,boolean参数设为true。
5.cacheManager.getCache("preConfigured", Long.class, String.class);
一个缓存是通过他的别名,key的类型,value的类型来索引的。比如说,要去得到在第二步声明的缓存,你需要他的别名="preConfigured",keyType=Long.class,valueType=String.class。为了类型安全,我们要求传入key和value的类型。如果我们期望的东西有不同的地方,CacheManager会在应用的生命周期中尽早的抛出一个ClassCastException。这样可以防止the Cache被混乱的类型污染。
6.Cache<Long, String> myCache = cacheManager.createCache("myCache",
CacheManager可以根据需要创建新的Cache实例。和步骤2CacheConfiguration一样,他也需要传入一个别名。添加进来的已经被实例化和初始化的Cache通过CacheManager.getCache的API被返回或者存取。
7.myCache.put(1L, "da one!");
最近添加过的Cache可以被存入条目里,这个条目是由键值对组成。这个put方法第一个参数是key,第二个参数是value。记得这个key和value的类型必须和被定义在CacheConfiguration里的类型一样。此外,键必须是唯一的,只能和一个值关联。
8.String value = myCache.get(1L);
通过调用cache.get(key)方法从缓存中检索值。他只接受一个key,返回相关联的value。如果没有相关联的value,返回null。
9.cacheManager.removeCache("preConfigured");
我们可以删除一个给定的Cache,CacheManager不仅会删除对缓存的引用,还会关闭它。这个缓存会释放所有的本地的临时资源(比如内存)。这个缓存的引用变得不可用。
10.cacheManager.close();
为了释放所有的临时资源(内存,线程),一个CacheManager提供他所管理的缓存实例,调用CacheManager.close(),它会依次关闭所有的缓存实例。
这有3个重要的事情:
try(CacheManager cacheManager = newCacheManagerBuilder()
.withCache("preConfigured", newCacheConfigurationBuilder(Long.class, String.class, heap(10)))
.build(true)) { // Same code as before [...]
}
1.CacheManager 实现了Closeable,所以可以自动地通过try-with-resources关闭。CacheManage必须关闭的干净。.在finally块中,使用try-with-resources或者其他更常见的方式来关闭
2.builders有不同的名称,你可以使用静态导入所有。
3.CacheManage使用build(true)来初始化。
使用XML配置:可以通过创建xml文件配置一个CacheManager
<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">
<key-type>java.lang.String</key-type>
<value-type>java.lang.String</value-type>
<resources>
<heap unit="entries">20</heap>
<offheap unit="MB">10</offheap>
</resources>
</cache>
<cache-template name="myDefaults">
<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">
<key-type>java.lang.Number</key-type>
</cache>
<cache alias="simpleCache" uses-template="myDefaults" /> </config>
1.声明一个叫foo的缓存
2.foo的key,value为string类型,默认是object
3.<heap unit="entries">20</heap> 在堆上容纳2000entries.
4.<offheap unit="MB">10</offheap> 500MB的离堆内存
5.<cache-template>这个元素让你创建一个抽象的配置,<cache>可以对他扩展
6.bar是一个cache,bar使用叫'myDefaults'的<cache-template>,重写了他的key类型
7.simpleCache是另一个cache,它使用了myDefaults配置他唯一的CacheConfiguration。
为了去解析XML配置,可以使用XmlCOnfiguration类:
URL myUrl = getClass().getResource("/my-config.xml");
Configuration xmlConfig = new XmlConfiguration(myUrl);
CacheManager myCacheManager = CacheManagerBuilder.newCacheManager(xmlConfig);
1.得到XML文件的本地的URL
2.实例化Configuration类
3.使用静态的org.ehcache.config.builders.CacheManagerBuilder.newCacheManager(org.ehcache.config.Configuration),让你创建你的CacheManage实例,这个实例用于从XMLConfiguration中使用Configuration.
创建一个支持集群的缓存管理器
要启用Terracotta集群,首先必须启动配置了集群存储的Terracotta服务器。另外,为了创建有集群支持的cachemanage,你必须提供集群服务配置。
CacheManagerBuilder<PersistentCacheManager> clusteredCacheManagerBuilder =
CacheManagerBuilder.newCacheManagerBuilder()
.with(ClusteringServiceConfigurationBuilder.cluster(URI.create("terracotta://localhost/my-application"))
.autoCreate());
PersistentCacheManager cacheManager = clusteredCacheManagerBuilder.build(true); cacheManager.close();
1.CacheManagerBuilder.newCacheManagerBuilder() 返回org.ehcache.config.builders.CacheManagerBuilde 实例。
2..with(ClusteringServiceConfigurationBuilder.cluster(URI.create("terracotta://localhost/my-application"))
使用ClusteringServiceConfigurationBuilder的静态方法.cluster(URL),是为了连接cacheManage到URL地址上的集群存储,返回一个集群的服务配置builer实例。在例子中的URL指向了Terracotta服务器上具有集群存储标识符my-application的集群存储(假设服务器运行在本地主机和端口9410上)。如果集群存储还不存在,query-param自动创建将在服务器中创建集群存储。
3.autoCreate():返回一个初始化的cacheManage,他可以用来创建集群缓存。
4.PersistentCacheManager cacheManager = clusteredCacheManagerBuilder.build(true);
如果集群存储不存在的话会自动创建它。
5.cacheManager.close():关闭cacheManager。
存储层
Ehcache3,作为一个以前的版本,提供了一个分层模型,允许在较慢的层(通常更丰富)存储大量数据。其理念是,存储更快,资源更少,但是是最热门数据的首选位置。较少热(较少使用)的数据被移动到更加丰富但是更慢的层。更热的数据移动到更快的层
一个经典的例子是使用带有持久磁盘存储的3层。
PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder()
.with(CacheManagerBuilder.persistence(new File(getStoragePath(), "myData")))
.withCache("threeTieredCache",
CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class,
ResourcePoolsBuilder.newResourcePoolsBuilder()
.heap(10, EntryUnit.ENTRIES)
.offheap(1, MemoryUnit.MB)
.disk(20, MemoryUnit.MB, true)
)
).build(true); Cache<Long, String> threeTieredCache = persistentCacheManager.getCache("threeTieredCache", Long.class, String.class);
threeTieredCache.put(1L, "stillAvailableAfterRestart"); persistentCacheManager.close();
1.PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder()
.with(CacheManagerBuilder.persistence(new File(getStoragePath(), "myData")))如果你想要使用磁盘存储(比如持久化缓存实例),你需要提供一个位置,以便将数据存储到CacheManagerBuilder.persistence()静态方法的磁盘上。
2.ResourcePoolsBuilder.newResourcePoolsBuilder().heap(10, EntryUnit.ENTRIES)
给堆区定义一个资源池。他将成为你的更快的但是更缓慢的池。
3..offheap(1, MemoryUnit.MB) 为离堆区定义一个资源池,很快而且大。
4..disk(20, MemoryUnit.MB, true) 为磁盘定义一个持久化的资源池。最后一个参数是true
5.threeTieredCache.put(1L, "stillAvailableAfterRestart"); JVM重启后所有的缓存值也是可用的(假设通过close()关闭CacheManager)。
数据新鲜度
数据的新鲜度通过过期时间(Expiry)来控制。下面的说明怎么配置生命周期
CacheConfiguration<Long, String> cacheConfiguration = CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class,
ResourcePoolsBuilder.heap(100))
.withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(20)))
.build();
1.过期是在缓存级别配置的,所以首先定义一个缓存配置
2.然后添加上一个Expiry,这里使用预定义的生存时间,配置需要的Duration。
ehcache的学习笔记(一)的更多相关文章
- Mybatis学习笔记汇总(包括源码和jar包)
博客整理 Mybatis学习笔记(一)--对原生jdbc中问题的总结 Mybatis学习笔记(二)--Mybatis框架 Mybatis学习笔记(三)--入门程序 MyBatis学习笔记(四)--入门 ...
- [原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
- Hibernate 马士兵 学习笔记 (转)
目录(?)[+] 第2课 Hibernate UML图 第3课 风格 第4课 资源 第5课 环境准备 第6课 第一个示例Hibernate HelloWorld 第7课 建立Annotation版本的 ...
- 【转载】Java学习笔记
转载:博主主页 博主的其他笔记汇总 : 学习数据结构与算法,学习笔记会持续更新: <恋上数据结构与算法> 学习Java虚拟机,学习笔记会持续更新: <Java虚拟机> 学习Ja ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
随机推荐
- json 获取属性值
ajax后台获取json数据 前台赋值.由于值太多 一个个写 val会类似的.因为直接字段值和 前台的标签id相同,这样只要循环结果集json赋值即可. 这里需要用到json的字段值 var data ...
- springmvc h5上传图片
工作中开发一个评价功能,需要上传拍照的图片,后台使用springmvc接收文件,前端FormData异步提交. 1. spring配置multipartResolver <bean id=&qu ...
- python运行selenium时出现的一个错误总结
1.SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame 场景:运用pan ...
- bzoj 2792: [Poi2012]Well【二分+贪心】
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; const ...
- bzoj 4517: [Sdoi2016]排列计数【容斥原理+组合数学】
第一个一眼就A的容斥题! 这个显然是容斥的经典问题------错排,首先考虑没有固定的情况,设\( D_n \)为\( n \)个数字的错排方案数. \[ D_n=n!-\sum_{t=1}^{n}( ...
- WFS1.1.0协议(增删改查)+openlayers4.3.1前端构建+geoserver2.15.1安装部署+shpfile数据源配置
WFS简介 1.WFS即,Web要素服务,全称WebFeatureService.GIS下,支持对地理要素的插入,更新,删除,检索和发现服务. 2.属于OGC标准下的通信协议.OGC标准下的GIS服务 ...
- Qt对象模型之一:信号和槽
一.信号和槽机制概述 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal).这种发出是没有目 ...
- Linux下GCC编译器的安装
通过apt-get方式下载的Qt5.9的gcc编译器版本只是4.8.3,无法打开一些Qt5的库头文件,所以准备在Llinux下再安装一个gcc5.3.0. 查看gcc版本 ubuntu下查看gcc的版 ...
- TSP+Floyd BestCoder Round #52 (div.2) 1002 Victor and Machine
题目传送门 题意:有中文版的 分析:(出题人的解题报告)我们首先需要预处理出任意两个国家之间的最短距离,因为数据范围很小,所以直接用Floyd就行了.之后,我们用f[S][i]表示访问国家的情况为S, ...
- rabbitmq实践笔记(一):安装、配置与使用初探
引言: 对于一个大型的软件系统来说,会有很多的组件.模块及不同的子系统一起协同工作,模块之间的通信需要一个可靠的通信管道来保证 ,通信管道需要解决解决很多问题,比如: 1)信息的发送者和接收者如何维持 ...