Ehcache 3.7文档—基础篇—GettingStarted
为了使用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文档—基础篇—Tiering Options
-
Ehcache 3.7文档—基础篇—XML Configuration
-
Ehcache 3.7文档—基础篇—GettingStarted
-
Ehcache 3.7文档—基础篇—GettingStarted
-
Ehcache 3.7文档—基础篇—Tiering Options
-
Ehcache 3.7文档—基础篇—XML Configuration
-
Java基础篇——线程、并发编程知识点全面介绍(面试、学习的必备索引文档)
-
POI操作Excel文档-基础篇
-
android activity开发文档翻译 - 1 - 基础篇
-
JavaScript 高级篇之DOM文档,简单封装及调用、动态添加、删除样式(六)_基础知识