Ehcache支持分层缓存的概念。

当想缓存堆内存以外的空间时,会发生下面的事情:

  • 1.将数据添加到缓存意味着必须序列化key和value。

  • 2.从缓存中读取数据意味着可能必须反序列化key和value。

单层设置

所有的单层选项都可以单独使用。例如,您可以将缓存包含仅在offheap中的数据。

以下可能性是有效配置:

  • offheap

  • 磁盘

CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, 

ResourcePoolsBuilder.newResourcePoolsBuilder().offheap(2, MemoryUnit.GB)).build();

首先在配置构建器中定义键和值类型。然后指定要使用的资源(层)。这里我们只使用off-heap。

堆层

每个缓存的起点也越快,因为不需要序列化。按值传递键和值,默认值为by-reference。堆层可以通过条目或大小来确定大小。

ResourcePoolsBuilder.newResourcePoolsBuilder().heap(10, EntryUnit.ENTRIES); 

// or

ResourcePoolsBuilder.newResourcePoolsBuilder().heap(10); 

// or

ResourcePoolsBuilder.newResourcePoolsBuilder().heap(10, MemoryUnit.MB);

1.堆上只允许10个条目。

2.指定10个条目的数据。

3.只允许10 MB。

堆外层

如果希望使用堆外,则必须定义资源池,并提供要分配的内存大小。

ResourcePoolsBuilder.newResourcePoolsBuilder().offheap(10, MemoryUnit.MB);

请记住,堆外存储的数据必须被序列化和反序列化 - 因此比堆慢。因此,您应该支持大量数据的堆外堆,其中堆上会对垃圾收集产生太严重的影响。

磁盘层

对于磁盘层,数据存储在磁盘上。磁盘越快,越专用,访问数据的速度就越快。

PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder() 

  .with(CacheManagerBuilder.persistence(new File(getStoragePath(), "myData"))) 

  .withCache("persistent-cache", CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class,

    ResourcePoolsBuilder.newResourcePoolsBuilder().disk(10, MemoryUnit.MB, true)) 

  )

  .build(true);

persistentCacheManager.close();

1.获得一个PersistentCacheManager

2.提供应存储数据的位置。

3.定义将由缓存使用的磁盘的资源池。第三个参数是一个布尔值,用于设置磁盘池是否持久。设置为true时,池是持久的。使用具有2个参数的版本时disk(long, MemoryUnit),池不是持久的。

持久性意味着缓存将在JVM重启后继续存在。重新启动JVM并CacheManager在同一位置创建磁盘持久性后,缓存中的所有内容仍然存在。无法在缓存管理器之间共享磁盘层。持久性目录当时专用于一个缓存管理器。

存储在磁盘上的数据必须被序列化/反序列化并写入磁盘/从磁盘读取 - 因此比堆和远程更慢。

多层设置

Ehcache要求堆层的大小小于offheap层的大小,并且offheap层的大小要小于磁盘层的大小。虽然Ehcache无法在配置时验证堆的基于计数的大小调整是否小于另一层的基于字节的大小调整,但您应该确保在测试期间就是这种情况。

考虑到上述因素,以下可能性是有效的配置:

堆+ offheap

堆+ offheap +磁盘

堆+ offheap +集群

堆+磁盘

堆+聚集

资源池

让我们重温前面使用的一个例子:

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);

这是一个使用3层(堆、堆外、磁盘)的缓存。它们是使用ResourcePoolsBuilder创建和链接的。声明顺序无关紧要(例如可以在堆前声明offheap),因为每一层都有一个高度。层的高度越高,层就越接近客户端。

理解资源池只是指定配置是非常重要的。它不是一个可以在缓存之间共享的池。例如,考虑以下代码:

ResourcePools pool = ResourcePoolsBuilder.newResourcePoolsBuilder().heap(10).build();

CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()

  .withCache("test-cache1", CacheConfigurationBuilder.newCacheConfigurationBuilder(Integer.class, String.class, pool))

  .withCache("test-cache2", CacheConfigurationBuilder.newCacheConfigurationBuilder(Integer.class, String.class, pool))

  .build(true);

您将得到两个缓存,每个缓存可以包含10个条目。不是10个条目的共享池。池永远不会在缓存之间共享。例外情况是集群缓存,可以共享或专用。

Ehcache3.x学习(二)分层的选项的更多相关文章

  1. emberjs学习二(ember-data和localstorage_adapter)

    emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...

  2. ReactJS入门学习二

    ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...

  3. TweenMax动画库学习(二)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  4. Hbase深入学习(二) 安装hbase

    Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...

  5. Struts2框架学习(二) Action

    Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...

  6. Python学习二:词典基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...

  7. Quartz学习--二 Hello Quartz! 和源码分析

    Quartz学习--二  Hello Quartz! 和源码分析 三.  Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...

  8. SpringCloud学习(二):微服务入门实战项目搭建

    一.开始使用Spring Cloud实战微服务 1.SpringCloud是什么? 云计算的解决方案?不是 SpringCloud是一个在SpringBoot的基础上构建的一个快速构建分布式系统的工具 ...

  9. DjangoRestFramework学习二之序列化组件、视图组件 serializer modelserializer

      DjangoRestFramework学习二之序列化组件.视图组件   本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组 ...

  10. SpringMVC入门学习(二)

    SpringMVC入门学习(二) ssm框架 springMVC  在上一篇博客中,我简单介绍了一下SpringMVC的环境配置,和简单的使用,今天我们将进一步的学习下Springmvc的操作. mo ...

随机推荐

  1. Tomcat服务器配置参考

    Coyote HTTP/1.1 Connector 概述 Coyote HTTP/1.1 Connector元素是一个支持HTTP/1.1协议的Connector组件.它使Catalina除了能够执行 ...

  2. (转)XMPP协议原理

    本文介绍XMPP协议原理及相关信息. XMPP协议简介   XMPP(Extensible Messageing and Presence Protocol:可扩展消息与存在协议)是目前主流的四种IM ...

  3. python pandas  使用列表快速创建数据 用于测试

    创建数据和行append数据 >>> df = pd.DataFrame([['AA', 1.00], ['Ks', 2.00]], columns=['name', 'age']) ...

  4. ThinkPHP学习(二)理清ThinkPHP的目录结构及访问规则,创建第一个控制器

    ThinkPHP的目录结构 回顾上一篇的安装目录: 目录对应关系 F:\\PHP├─index.php       入口文件├─README.md       README文件├─Applicatio ...

  5. 戏说 .NET GDI+系列学习教程(三、Graphics类的应用_打印收银小票)

    #region 打印 /// <summary> /// 打印字符串内容 /// </summary> /// <returns></returns> ...

  6. 词表征 1:WordNet、0-1表征、共现矩阵、SVD

    原文地址:https://www.jianshu.com/p/c1e4f42b78d7 一.基于知识的表征 参见图1.1,WordNet中包含同义词集(synonym sets)和上位词(hypern ...

  7. Java jar文件

    JAR(Java Archive)是基于ZIP文件格式的文件格式. 它用于捆绑Java应用程序或小程序的资源,类文件,声音文件,图像等. 它还提供数据压缩.一个JAR文件作为一种特殊类型的ZIP文件. ...

  8. 序列化之 TLV

    目录 序列化之 TLV 1. 紧凑模式 2. 可扩展性 3. 更好的可扩展性 4. 自解释性 5. 跨语言特性 6. 代码自动化:IDL语言 7. 总结 序列化之 TLV 通信协议可以理解两个节点之间 ...

  9. 34-Ubuntu-用户权限-05-超级用户

    超级用户 Linux系统中的root(超级用户)账号通常用于系统的维护和管理,对操作系统的所有资源具有访问的权限. 在大多数的Linux版本中,都不推荐直接使用root账号登录系统. 在Linux安装 ...

  10. VS项目种类GUID

    在VS里新建的类库项目,在添加新建项时往往找不到模板.比如想新建一个WPF的资源词典文件,VS认为该类库项目不是WPF类型,就没有列出新建资源词典的模板.解决办法是在csproj文件的<Prop ...