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. linux python3 venv 虚拟环境报错 [-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 2.

    解决办法: 先创建没有pip的虚拟环境,然后启动虚拟环境后,再安装pip 办法一: 亲测失败了... python3 -m venv --without-pip py36env 办法二 sudo ap ...

  2. TCP/IP报文格式

    1.TCP首部格式 1.1 格式各字段含义 源端口号( 16 位):它(连同源主机 IP 地址)标识源主机的一个应用进程. 目的端口号( 16 位):它(连同目的主机 IP 地址)标识目的主机的一个应 ...

  3. CSS:CSS 链接

    ylbtech-CSS:CSS 链接 1.返回顶部 1. CSS 链接 不同的链接可以有不同的样式. 链接样式 链接的样式,可以用任何CSS属性(如颜色,字体,背景等). 特别的链接,可以有不同的样式 ...

  4. 网络数据包最大长度 MTU 分片 转发https://blog.csdn.net/singular2611/article/details/52513406

    1.数据链路层对数据帧的长度都有一个限制,也就是链路层所能承受的最大数据长度,这个值称为最大传输单元,即MTU.以以太网为例,这个值通常是1500字节. 2.对于IP数据包来讲,也有一个长度,在IP包 ...

  5. 022_IO流

    对象流 // FileInput.FileOutputStream(节点流)ObjectInputStreamObjectOutputStream 序列化 把内存的数据信息永久的保存在硬盘中,这个过程 ...

  6. 集合 HashMap 的原理,与 Hashtable、ConcurrentHashMap 的区别

    一.HashMap 的原理 1.HashMap简介 简单来讲,HashMap底层是由数组+链表的形式实现,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表 ...

  7. java-day23

    事务的四大特征: 1.原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败. 2.持久性:当事务提交或回滚后,数据库会持久化的保存数据. 3.隔离性:多个事务之间,相互独立. 4.一致性:事务 ...

  8. 【洛谷】P1229快速幂

    题目链接:https://www.luogu.org/problemnew/show/P1226 题意:求b^p % m之后的结果 题解:快速幂模板 代码: #include<iostream& ...

  9. AVR446步进电机算法推导及应用

    https://blog.csdn.net/Renjiankun/article/details/80513839?utm_source=copy

  10. bootstrap-自带插件(完成的小功能)

    模态框 务必将模态框的HTML代码放在文档的最高层级内(也就是说,尽量作为 body 标签的直接子元素),以避免其他组件影响模态框的展现和/或功能. <!-- 触发模态框的按钮 --> & ...