|
|
|
|
公众号矩阵

大厂都在用的本地缓存Ehcache原来这么强!

缓存管理器内可放置若干个cache,所有cache都实现了Ehcache接口,是实际使用的缓存实例,真正地存放数据。通过缓存管理器模式,即可实现在单应用中隔离多个缓存实例,各自独立服务不同业务场景,缓存数据物理隔离,同时需要时又可组合共享。

作者:JavaEdge来源:JavaEdge|2021-02-17 21:04

最为广泛使用的纯Java开发的轻量级本地缓存框架。

Ehcache架构图

核心组件

  • cache manager

缓存管理器,可多实例

  • cache

缓存管理器内可放置若干个cache,所有cache都实现了Ehcache接口,是实际使用的缓存实例,真正地存放数据。通过缓存管理器模式,即可实现在单应用中隔离多个缓存实例,各自独立服务不同业务场景,缓存数据物理隔离,同时需要时又可组合共享。

  • element

单条缓存数据的组成单位。

  • system of record(SOR)

实际缓存数据都是通过SOR读写的,可以是真正的业务逻辑、外部接口调用、存放真实数据的DB。

它的缓存介质涵盖堆内存(heap)、堆外内存(BigMemory商用版本支持)和磁盘,各介质可独立设置属性和策略。

Ehcache最初是独立的本地缓存框架,随着发展,结合Terracotta服务阵列模型,可支持分布式缓存集群,主要有RMI、JGroups、JMS和Cache Server等传播方式进行节点间通信,如架构图左侧部分。

数据流转

  • Flush

缓存条目向低层次移动

  • Fault

从低层拷贝一个对象到高层。在获取缓存的过程中,某层发现自己的该缓存数据已失效,就触发Fault。

  • Eviction

把缓存项除去

  • Expiration

失效状态

  • Pinning

强制缓存项保持在某层

数据流转生命周期

L1:本地内存层,L2:Terracotta服务节点层

配置

  1. <ehcache> 
  2. <!-- 指定一个文件目录,当Ehcache把数据写到硬盘上时,将把数据写到这个文件目录下 --> 
  3. <diskStore path="java.io.tmpdir"/> 
  4.  
  5. <!-- 设定缓存的默认数据过期策略 --> 
  6. <defaultCache 
  7.         maxElementsInMemory="10000" 
  8.         eternal="false" 
  9.         overflowToDisk="true" 
  10.         timeToIdleSeconds="0" 
  11.         timeToLiveSeconds="0" 
  12.         diskPersistent="false" 
  13.         diskExpiryThreadIntervalSeconds="120"/> 
  14.  
  15. <!--   
  16.     设定具体的命名缓存的数据过期策略 
  17.  
  18.     cache元素的属性: 
  19.         name:缓存名称 
  20.  
  21.         maxElementsInMemory:内存中最大缓存对象数 
  22.  
  23.         maxElementsOnDisk:硬盘中最大缓存对象数,若是0表示无穷大 
  24.  
  25.         eternal:true表示对象永不过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false 
  26.  
  27.         overflowToDisk:true表示当内存缓存的对象数目达到了maxElementsInMemory界限后,会把溢出的对象写到硬盘缓存中。注意:如果缓存的对象要写入到硬盘中的话,则该对象必须实现了Serializable接口才行。 
  28.  
  29.         diskSpoolBufferSizeMB:磁盘缓存区大小,默认为30MB。每个Cache都应该有自己的一个缓存区。 
  30.  
  31.         diskPersistent:是否缓存虚拟机重启期数据 
  32.  
  33.         diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认为120秒 
  34.  
  35.         timeToIdleSeconds:设定允许对象处于空闲状态的最长时间,以秒为单位。当对象自从最近一次被访问后,如果处于空闲状态的时间超过了timeToIdleSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清空。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地处于空闲状态 
  36.  
  37.         timeToLiveSeconds:设定对象允许存在于缓存中的最长时间,以秒为单位。当对象自从被存放到缓存中后,如果处于缓存中的时间超过了 timeToLiveSeconds属性值,这个对象就会过期,Ehcache将把它从缓存中清除。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地存在于缓存中。timeToLiveSeconds必须大于timeToIdleSeconds属性,才有意义 
  38.  
  39.         memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。可选策略有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数)。 
  40. --> 
  41. <cache name="CACHE1" 
  42.        maxElementsInMemory="1000" 
  43.        eternal="true" 
  44.        overflowToDisk="true"/>   
  45.  
  46. <cache name="CACHE2" 
  47.     maxElementsInMemory="1000" 
  48.     eternal="false" 
  49.     timeToIdleSeconds="200" 
  50.     timeToLiveSeconds="4000" 
  51.     overflowToDisk="true"/> 
  52. </ehcache> 

虽然Ehcache支持磁盘持久化,但由于存在两级缓存介质。

在一级内存中的缓存,如果没有主动刷入磁盘,应用异常时依然会出现缓存数据丢失。

可按需将缓存刷到磁盘,将缓存刷到磁盘的操作cache.flush()。

对象的磁盘写入,前提是要将对象序列化。

特性

Ehcache的多线程机制专门优化高并发场景

  • 简单

小小的jar包,简单配置开箱即用,单机场景更无需依赖其它组件

  • 多种缓存策略
  • 两级缓存(内存&磁盘)
  • 相比一般本地缓存,有了磁盘,将可缓存更多数据
  • 监控
  • 具有缓存和缓存管理器的监听接口,能更简单方便的进行缓存实例的监控管理
  • 支持多缓存管理器实例,以及一个实例的多个缓存区域
  • 超时

Ehcache的超时设置是针对整个cache实例的策略,而没有提供方便的细粒度单独key的超时处理。过期失效的缓存数据无法被GC回收,时间越长缓存越多,内存占用越大,内存泄露概率越大

本文转载自微信公众号「JavaEdge」,可以通过以下二维码关注。转载本文请联系JavaEdge公众号。

【编辑推荐】

  1. Java基础入门之自定义异常、形参个数可变的方法、水仙花数
  2. 针对JavaScript开发人员的Rust简介
  3. JavaScript - 精通Console
  4. 【穆哥学堂】--Java工程师系列课程之4--《Java Swing》视频课程
  5. JavaScript之深入理解this
【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢
24H热文
一周话题
本月获赞

订阅专栏+更多

数据湖与数据仓库的分析实践攻略

数据湖与数据仓库的分析实践攻略

助力现代化数据管理:数据湖与数据仓库的分析实践攻略
共3章 | 创世达人

6人订阅学习

云原生架构实践

云原生架构实践

新技术引领移动互联网进入急速赛道
共3章 | KaliArch

33人订阅学习

数据中心和VPDN网络建设案例

数据中心和VPDN网络建设案例

漫画+案例
共20章 | 捷哥CCIE

220人订阅学习

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO官微