Ehcache3.x学习(二)分层的选项
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学习(二)分层的选项的更多相关文章
- emberjs学习二(ember-data和localstorage_adapter)
		emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ... 
- ReactJS入门学习二
		ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ... 
- TweenMax动画库学习(二)
		目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ... 
- Hbase深入学习(二) 安装hbase
		Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ... 
- Struts2框架学习(二) Action
		Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ... 
- Python学习二:词典基础详解
		作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ... 
- Quartz学习--二  Hello Quartz! 和源码分析
		Quartz学习--二 Hello Quartz! 和源码分析 三. Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ... 
- SpringCloud学习(二):微服务入门实战项目搭建
		一.开始使用Spring Cloud实战微服务 1.SpringCloud是什么? 云计算的解决方案?不是 SpringCloud是一个在SpringBoot的基础上构建的一个快速构建分布式系统的工具 ... 
- DjangoRestFramework学习二之序列化组件、视图组件 serializer  modelserializer
		DjangoRestFramework学习二之序列化组件.视图组件 本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组 ... 
- SpringMVC入门学习(二)
		SpringMVC入门学习(二) ssm框架 springMVC 在上一篇博客中,我简单介绍了一下SpringMVC的环境配置,和简单的使用,今天我们将进一步的学习下Springmvc的操作. mo ... 
随机推荐
- 攻防世界 MISC篇
			Excaliflag 一张图片,winhex打开没什么发现,分值不高,应该属于常见的图片隐写题目.如果对于图片的格式有详细的了解,应该很容易就能够知道了属于最低有效位(LSB)隐写,下面是通过phot ... 
- Sqli labs系列-less-4 这关好坑!!!
			这章,可能我总结开会比较长,图比较多,因为,我在做了一半,走进了一个死胡同,脑子,一下子没想开到底为啥.... 然后我自己想了好长时间也没想开,我也不想直接就去看源码,所以就先去百度了一下,结果一下子 ... 
- LYOI2018 Hzy's Planets
			题目描述: 删掉一个边,看其是否联通,图是一棵树,在线,多组询问. 数据范围: \(n \leq 10^5\) 题解: (休闲一下) 这种直接用dfs序即可,直接讨论连边的位置就行. 还有一种做法懒得 ... 
- bootstrap 的 datetimepicker,同时有日期和时间, 且开始时间要早于结束时间
			首先,引入jquery, bootstrap 和 bootstrap-datetimepicker datetimepicker的下载地址: http://www.bootcss.com/p/boot ... 
- 剑指offer第二版面试题2:数组中重复的数字(JAVA版)
			题目:在一个长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的.请找出数组中任意一个重复的数字,但是不能修改输入的数组.例如,如果输入长度为8的数组{2,3,5,4,3 ... 
- 【android】获取本机ip地址
			方法是利用网址:http://pv.sohu.com/cityjson?ie=utf-8,返回String类型的ip地址: public static String getNetIp() { Stri ... 
- 类型转换、类型安全以及is和as的使用
			class Program { static void Main(string[] args) { //1.类型转换 { //隐式转换:不需要转型,因为new返回一个Employee对象,而Objec ... 
- JUC源码分析-集合篇(三)ConcurrentLinkedQueue
			JUC源码分析-集合篇(三)ConcurrentLinkedQueue 在并发编程中,有时候需要使用线程安全的队列.如果要实现一个线程安全的队列有两种方式:一种是使用阻塞算法,另一种是使用非阻塞算法. ... 
- 标准 IO fread 与 fwrite 的使用(可以实现二进制流的读写)
			size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); size_t fwrite(const void ... 
- Linux下Qt调用共享库文件.so
			修改已有的pro文件,添加如下几句: INCLUDEPATH += /home/ubuntu/camera/camera/LIBS += -L/home/ubuntu/camera/camera -l ... 
