写点什么

Ehcache 缓存设计原理,写得太好了

作者:MySQL神话
  • 2021 年 11 月 27 日
  • 本文字数:1845 字

    阅读完需:约 6 分钟

可以取到真实数据的组件,可以是真正的业务逻辑、外部接口调用、存放真实数据的数据库等,缓存就是从 SOR 中读取或者写入到 SOR 中去的。


整个 Ehcache 提供了对 JSR、JMX 等标准支持,能够较好的兼容和移植,同时对各类对象有较完善的监控管理机制。


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


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


数据流转


===================================================================


  • Flush


缓存条目向低层次移动。


  • Fault:从低层拷贝一个对象到高层。在获取缓存的过程中,某一层发现自己的该缓存条目已经失效,就触发了 Fault 行为。

  • Eviction:把缓存条目除去。

  • Expiration:失效状态。

  • Pinning:强制缓存条目保持在某一层。


下图反映数据在各个层之间的流转及各层数据的生命周期



L1:本地内存层


L2:Terracotta 服务节点层


配置


=================================================================


<ehcache>


<diskStore path="java.io.tmpdir"/>


<defaultCache


maxElementsInMemory="10000"


eternal="false"


overflowToDisk="true"


timeToIdleSeconds="0"


timeToLiveSeconds="0"


diskPersistent="false"


diskExpiryThreadIntervalSeconds="120"/>


<!--


设定具体的命名缓存的数据过期策略


cache 元素的属性:


name:缓存名称


maxElementsInMemory:内存中最大缓存对象数


maxElementsOnDisk:硬盘中最大缓存对象数,若是 0 表示无穷大


eternal:true 表示对象永不过期,此时会忽略 timeToIdleSeconds 和 timeToLiveSeconds 属性,默认为 false


overflowToDisk:true 表示当内存缓存的对象数目达到了 maxElementsInMemory 界限后,会把溢出的对象写到硬盘缓存中。注意:如果缓存的对象要写入到硬盘中的话,则该对象必须实现了 Serializable 接口才行。


diskSpoolBufferSizeMB:磁盘缓存区大小,默认为 30MB。每个 Cache 都应该有自己的一个缓存区。


diskPersistent:是否缓存虚拟机重启期数据


diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认为 120 秒


timeToIdleSeconds: 设定允许对象处于空闲状态的最长时间,以秒为单位。当对象自从最近一次被访问后,如果处于空闲状态的时间超过了 timeToIdleSeconds 属性值,这个对象就会过期,EHCache 将把它从缓存中清空。只有当 eternal 属性为 false,该属性才有效。如果该属性值为 0,则表示对象可以无限期地处于空闲状态


timeToL


《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享


iveSeconds:设定对象允许存在于缓存中的最长时间,以秒为单位。当对象自从被存放到缓存中后,如果处于缓存中的时间超过了 timeToLiveSeconds 属性值,这个对象就会过期,Ehcache 将把它从缓存中清除。只有当 eternal 属性为 false,该属性才有效。如果该属性值为 0,则表示对象可以无限期地存在于缓存中。timeToLiveSeconds 必须大于 timeToIdleSeconds 属性,才有意义


memoryStoreEvictionPolicy:当达到 maxElementsInMemory 限制时,Ehcache 将会根据指定的策略去清理内存。可选策略有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数)。


-->


<cache name="CACHE1"


maxElementsInMemory="1000"


eternal="true"


overflowToDisk="true"/>


<cache name="CACHE2"


maxElementsInMemory="1000"


eternal="false"


timeToIdleSeconds="200"


timeToLiveSeconds="4000"


overflowToDisk="true"/>


</ehcache>


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


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

总结

以上是字节二面的一些问题,面完之后其实挺后悔的,没有提前把各个知识点都复习到位。现在重新好好复习手上的面试大全资料(含 JAVA、MySQL、算法、Redis、JVM、架构、中间件、RabbitMQ、设计模式、Spring 等),现在起闭关修炼半个月,争取早日上岸!!!


下面给大家分享下我的面试大全资料


  • 第一份是我的后端 JAVA 面试大全



后端 JAVA 面试大全


  • 第二份是 MySQL+Redis 学习笔记+算法+JVM+JAVA 核心知识整理



MySQL+Redis 学习笔记算法+JVM+JAVA 核心知识整理


  • 第三份是 Spring 全家桶资料



MySQL+Redis 学习笔记算法+JVM+JAVA 核心知识整理


本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

用户头像

MySQL神话

关注

还未添加个人签名 2021.11.12 加入

还未添加个人简介

评论

发布
暂无评论
Ehcache缓存设计原理,写得太好了