|

其他

【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未知归属地
全部评论
最多点赞
最新发布
最早发布
写回答
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。
发表

我要发帖子

了解社区公约,与您携手共创和谐专业的开发者社区。