【Ehcache开发指南】001:Ehcache基础——Ehcache入门配置
Ehcache的配置
为了开始使用Ehcache,需要配置第一个CacheManager和Cache。Ehcache支持通过编程或XML方式配置。
编程配置
Java配置最容易通过构建器方式实现。与Ehcache的早期版本一样,处理缓存的规范方法是通过CacheManager。
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)静态方法CacheManagerBuilder.newCacheManagerBuilder返回一个新的org.ehcache.config.builders.CacheManagerBuilder实例。
- (2)生成别名为“preConfigured”的Cache。当在实际的CacheManager实例上调用cacheManager.build()时,将创建此缓存。第一个String参数是缓存别名,用于从CacheManager检索缓存。第二个参数org.ehcache.config.CacheConfiguration用于配置缓存。我们在org.ehcache.config.builders.CacheConfigurationBuilder上使用静态newCacheConfigurationBuilder()方法来创建默认配置。
- (3)最后,调用build()返回一个完全实例化但未初始化的CacheManager可以使用。
- (4)在使用CacheManager之前,需要初始化它,这可以通过以下两种方式之一完成:在CacheManager实例上调用CacheManager.init(),或调用CacheManagerBuilder.build(boolean init)方法,并将boolean参数设置为true。
- (5)通过将缓存的别名、键类型和值类型传递给CacheManager来检索缓存。例如,要获取在步骤2中声明的缓存,需要alias="preConfigured"、keyType=Long.class 和 valueType=String.class。为了类型安全,我们要求传入键和值类型。如果这些与我们预期的不同,CacheManager会在应用程序生命周期的早期抛出ClassCastException。这可以防止缓存被随机类型污染。
- (6)CacheManager可根据需要创建新的Cache实例。就像在步骤2中一样,它需要传入别名和CacheConfiguration。添加的实例化和完全初始化的Cache将通过CacheManager.getCache API返回和/或访问。
- (7)新添加的Cache 现在可用于存储由键值对组成的条目。put方法的第一个参数是键,第二个参数是值。请记住,键和值类型必须与CacheConfiguration中定义的类型相同。此外,键必须是唯一的,并且仅与一个值关联。
- (8)通过调用 cache.get(key)方法从缓存中检索值。它只接受一个参数,即键,并返回与该键关联的值。如果没有与该键关联的值,则返回null。
- (9)可以针对特定的Cache执行CacheManager.removeCache(String) 。CacheManager不仅将删除其对Cache的引用,还将关闭它。Cache 释放所有本地持有的临时资源(如内存)。对此Cache 的引用将不可用。
- (10)为了释放CacheManager提供给其管理的Cache实例的所有临时资源(内存、线程、...),必须调用CacheManager.close(),此时会关闭已知的所有Cache实例。
以下是一个较短的版本,包括3件重要的事情:
try(CacheManager cacheManager = newCacheManagerBuilder() //(1)
.withCache("preConfigured", newCacheConfigurationBuilder(Long.class, String.class, heap(10))) //(2)
.build(true)) { //(3)
// Same code as before [...]
}
- (1)CacheManager实现了Closeable,因此可以通过try-with-resources自动关闭。CacheManager必须干净关闭。在finally块中,在某些关闭钩子中使用资源尝试或(对于正常应用程序来说更频繁)。
- (2)具有不同名称的生成器,可以对所有生成器使用静态导入。
- (3)CacheManager是使用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"> <!--(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)声明别名为“foo”的Cache。
- (2)foo的键和值声明为String类型;如果未指定,默认值为java.lang.Object。
- (3)foo被声明为在堆上容纳多达20个条目,
- (4)以及在开始驱逐之前高达10MB的堆外内存。
- (5)
<cache-template>
元素允许创建抽象配置,然后<cache>
可以进一步对其配置进行“继承”。 - (6)bar就是这样一个Cache。bar使用名为“myDefaults”的
<cache-template>
,并将其key-type
覆盖为更宽的类型。 - (7)simpleCache是另一个这样的缓存。它将myDefaults配置用于其唯一的CacheConfiguration。
为了解析XML配置,可以使用XmlConfiguration类型:
URL myUrl = getClass().getResource("/my-config.xml");
Configuration xmlConfig = new XmlConfiguration(myUrl);
CacheManager myCacheManager = CacheManagerBuilder.newCacheManager(xmlConfig);
支持集群的缓存管理器
要使用Terracotta集群,首先必须启动配置了集群存储群服务器。此外,要创建具有集群支持的缓存管理器,需要提供集群服务配置:
CacheManagerBuilder<PersistentCacheManager> clusteredCacheManagerBuilder =
CacheManagerBuilder.newCacheManagerBuilder() // (1)
.with(ClusteringServiceConfigurationBuilder.cluster(URI.create("terracotta://localhost/my-application")) // (2)
.autoCreateOnReconnect(c -> c)); // (3)
PersistentCacheManager cacheManager = clusteredCacheManagerBuilder.build(true); // (4)
cacheManager.close(); // (5)
上述配置:
- (1)返回org.ehcache.config.builders.CacheManagerBuilder实例;
- (2)使用ClusteringServiceConfigurationBuilder的静态方法.cluster(URI)将缓存管理器连接到返回集群服务配置生成器实例的指定URI处的集群存储。示例中提供的示例URI指向Terracotta服务器上具有集群存储标识符my-app的集群存储(假设服务器运行在localhost和端口9410上);如果集群存储还不存在,查询参数自动创建将在服务器中创建集群存储。
- (3)返回可用于创建集群缓存的完全初始化缓存管理器。
- (4)如果集群存储尚不存在,请自动创建该存储。
- (5)关闭缓存管理器。
存储层
Ehcache 3与以前的版本一样,提供了分层模型,允许在较慢的层(通常更丰富)上存储越来越多的数据。 其想法是,热度较高(使用频率较高)的数据放在速度更快但资源较为稀缺的存储层上,而热度较低(使用频率较低)的数据被移动到资源更丰富但速度较慢的存储层。
三层模型
以下是一个典型的使用持久磁盘存储的三层示例。
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 实例),则必须向CacheManagerBuilder.persistence()静态方法提供数据应存储在磁盘上的位置。
- (2)可以为堆定义一个资源池。这个资源池会更快但所提供的资源也更小。
- (3)可以为堆外定义一个资源池。这个资源池还是很快的,而且会更大一点。
- (4)可以为磁盘定义永久资源池。它是持久的(最后一个参数为true)。
- (5)存储在缓存中的所有值在JVM重新启动后都将可用(假设已通过调用close()将CacheManager关闭干净)
数据新鲜度
在Ehcache中,数据新鲜度通过Expiry控制。以下示例说明如何配置time-to-live(生存时间到期)。
CacheConfiguration<Long, String> cacheConfiguration = CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class,
ResourcePoolsBuilder.heap(100)) // (1)
.withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(20))) // (2)
.build();
- (1)Expiry是在缓存级别配置的,所以从定义缓存配置开始,
- (2)然后向其添加Expiry,在这里使用预定义的time-to-live,并配置了所需的Duration(持续时间)。
浏览820 发布于2022-03-04 08:41未知归属地
全部评论
最多点赞
最新发布
最早发布
写回答
- 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
- 如您发布的内容为转载内容,请注明内容来源。
发表
我要发帖子
了解社区公约,与您携手共创和谐专业的开发者社区。