Ehcache存储策略总结

如何使用

 导包:

<!-- 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   这些存储策略可以随意组合,比如以下的使用方式都是支持的。  

- 堆 + 堆外  

- 堆 + 堆外 + 磁盘  

- 堆 + 堆外 + 集群  

- 堆 + 磁盘  - 堆 + 集群

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

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值