如何使用

导包:

<!-- https://mvnrepository.com/artifact/org.ehcache/ehcache -->
<dependency><groupId>org.ehcache</groupId><artifactId>ehcache</artifactId><version>3.9.4</version>
</dependency>

使用 :

// 第一步 创建cache manager
CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder() .withCache("preConfigured",CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(10))) .build();
cacheManager.init();
//第二步 创建cache
Cache<Long, String> preConfigured =cacheManager.getCache("preConfigured", Long.class, String.class); Cache<Long, String> myCache = cacheManager.createCache("myCache", CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(10)));
//第三步 使用
myCache.put(1L, "da one!");
String value = myCache.get(1L); cacheManager.removeCache("preConfigured"); //第四步  关闭cache
cacheManager.close(); 

build cacheManager时也同时创建了一个名为 "preConfigured"的cache,也可以在cacheManager创建完后再创建cache,比如后面的“myCache"。之后使用就如同使用普通的map一样。 但非常关键的一点,如果cache不再用了,要记得删掉,cacheManager也要及得及时close掉,否则容易导致内存泄露。

在createCache时,需要指定3个参数,分别是cache里key value的class,和一份存储配置ResourcePools。 这是因为ehcache支持多级存储(这也是它最大的特性),你可以配置部分数据优先存储在堆内,存不下就存堆外,再存不下可以存在磁盘。 所以它需要知道key和value的class,用来对K-V做序列化和反序列化,方便多层级之间数据传输。   因为存在对象的序列化和反序列化,你就不得不考虑下性能问题,因为序列化和反序列化都是需要时间的。但所幸的是有个局部性法则让你不用太多担心。ehcache里默认cache策略是LRU,它优先把数据优先存堆(heap)里的,内存中存不下以及被LUR淘汰下来的数据会被ehcache序列化后存入堆外或者磁盘。LRU策略会逐步把低频使用的数据往下层存储淘汰,从而保证高频数据尽可能都在上层存储中。   像上面ehcahe这种多层级的设计,可以再尽可能少的影响性能的情况下减少堆内内存的使用,也可以减少内存的使用。 但有个可能的风险点,java语言本身其实是不太希望用户使用堆外的空间的,因为堆外空间脱离的JVM的控制,JVM无法对其做GC,可能会有内存泄露的风险。ehcache不得不让用户去考虑内存空间释放的问题,虽然很简单调用下removeCahce()和close()就行,但依旧有内存泄露的风险

多级存储

  上面已经提到了Ehcache的多级存储,共支持4个级别的存储。  1. 堆 2. 堆外 3. 磁盘 4. 集群   如果分别使用上面四中存储,Ehcache提供一个个CacheConfigurationBuilder来创建相关配置。

CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.newResourcePoolsBuilder().offheap(2, MemoryUnit.GB)).build();  // 1
ResourcePoolsBuilder.newResourcePoolsBuilder().heap(10, EntryUnit.ENTRIES);     // 2
// or
ResourcePoolsBuilder.heap(10);
// or
ResourcePoolsBuilder.newResourcePoolsBuilder().heap(10, MemoryUnit.MB); 

可以使用CacheConfigurationBuilder来创建cache配置,分别用heap()offheap()来指定堆存储和堆外存储配置,这两个方法都支持指定存储实例数或者存储空间的大小。上面代码中1指定最大存储2gb,2表最多存储10个实例,超过了就会用默认的LRU策略往下层淘汰。   如果要使用磁盘存储,在cache创建是需要先指定存储的路径和文件名,使用示例如下

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

集群存储方式配置参考文档cluster cache   这些存储策略可以随意组合,比如以下的使用方式都是支持的。  

- 堆 + 堆外  

- 堆 + 堆外 + 磁盘  

- 堆 + 堆外 + 集群  

- 堆 + 磁盘  - 堆 + 集群

更多资料可以参考官方文档

Ehcache存储策略总结相关推荐

  1. 【VMware vSAN 6.6】5.1.基于存储策略的管理:vSAN硬件服务器解决方案

    目录 1. 简介 1.1.适用于HCI的企业级存储 2. 体系结构 2.1.带有本地存储的服务器2.2.存储控制器虚拟系统套装的缺点 2.3.vSAN在vSphere Hypervisor中自带 2. ...

  2. 【Android 内存优化】Android 原生 API 图片压缩代码示例 ( PNG 格式压缩 | JPEG 格式压缩 | WEBP 格式压缩 | 动态权限申请 | Android10 存储策略 )

    文章目录 一. 图片质量压缩 二. 图片尺寸压缩 三. Android 10 文件访问 四. 完整源码示例 上一篇博客 [Android 内存优化]图片文件压缩 ( Android 原生 API 提供 ...

  3. 22 WM配置-策略-入库策略2-定义未清存储策略C(Open Strategy)

    业务背景:入库策略之2 未清存储策略 就是Open Strategy,我们通常说的存储类型 上架C策略.未清存储策略主要的特点就是一个存储类型下面就创建一个仓位,主要用于仓库未规划的平地区域或某些犄角 ...

  4. 【Clickhouse】Clickhouse 多路径存储策略

    文章目录 1.概述 2.JBOD策略: HOT/COLD 策略: 1.概述 转载:Clickhouse 多路径存储策略 在Clickhouse 19.15版本之前,MergeTree 只支持单路径存储 ...

  5. VMware vSAN 6.7实战(六)配置vSAN存储策略

    VMware vSAN 6.7实战(六)配置vSAN存储策略 https://blog.51cto.com/11694088/2462016 这一节我们继续本系列文章中的第三节继续讲述具体配置vSAN ...

  6. 高性能本地缓存Ristretto(一)——存储策略

    Ristretto是Dgraph基于golang实现的一个高性能的本地缓存库.特点是高命中率,高吞吐量,可自定义存储成本,支持一些自定义回调函数,并提供了较多的统计信息. 本文将主要讲述Ristret ...

  7. Hadoop3 - HDFS 文件存储策略

    一.HDFS 文件存储策略 Hadoop 允许将不是热数据或者活跃数据的数据分配到比较便宜的存储上,用于归档或冷存储.可以设置存储策略,将较旧的数据从昂贵的高性能存储上转移到性价比较低(较便宜)的存储 ...

  8. 数据存储策略——lsm-tree

    文章目录 一.背景 二.lsm-tree简介 三.lsm-tree设计思想 四.lsm-tree原理 1.写操作 2.读操作 3.有序表持久化 4.后台压缩 五.lsm-tree的应用 六.lsm-t ...

  9. 8、HDFS内存存储策略支持和“冷热温”存储

    Hadoop系列文章目录 1.hadoop3.1.4简单介绍及部署.简单验证 2.HDFS操作 - shell客户端 3.HDFS的使用(读写.上传.下载.遍历.查找文件.整个目录拷贝.只拷贝文件.列 ...

最新文章

  1. GitHub分享《深度学习500问》优质资源
  2. 农林废弃物如何变废为宝?
  3. 初等数学O 集合论基础 第二节 映射与集合的势
  4. 10 Lessons Learned Doing ICOs
  5. 他在 B 站有 140 万粉丝,今天来免费带你学 Linux 了!
  6. param.requires_grad = False的作用
  7. Spring零配置之@Configuration注解详解
  8. java 课后习题 判断两个圆是否相交 圆和直线的位置关系
  9. java ajax cookies_HttpOnly cookie如何处理AJAX请求?
  10. 手柄测试Debug记录
  11. Leetcode-845. 数组中的最长山脉(最详细解法)
  12. linux下实现文件双向同步 unsion,unison做数据双向同步
  13. Xcelsius 的苦难日子
  14. android通过代码设置铃声_我想在国产安卓系统,用上这些超好用的原生 Android 功能...
  15. 剪切板的使用: 复制 粘贴
  16. 苹果x专用计算机下,电脑卡iPhoneX在线软件
  17. docx文件格式转PDF格式
  18. Richard Hamming ``You and Your Research''
  19. 计算机人机交互接口论文,人机交互小论文
  20. 互联网大厂公司月饼大比拼!羡慕啊!

热门文章

  1. C++基础回顾-强制类型转换
  2. 施密特出售Google股票套现3.27亿美元
  3. K均值算法matlab代码实现
  4. Python 3 os.walk使用详解
  5. Git学习笔记:Git简介
  6. IEEE conference 中出现的PDF字体嵌入的问题
  7. [云炬ThinkPython阅读笔记]2.2 变量名
  8. 科大星云诗社动态20210125
  9. VTK修炼之道74:交互部件_Widget的创建
  10. PIC单片机入门_输入输出端口详解