zoukankan      html  css  js  c++  java
  • Ehcache缓存回收策略

    Ehcache缓存

    简介

    Ehcache是一个用JAVA实现的,使用简单,高速,实现线程安全的缓存管理类库,Ehcache提供了用内存,磁盘文件存储,以及分布式存储方式等多种灵活的Cache管理方案。采用限制比较宽松的Apache License v2.0作为授权方式,被广泛地用于Hibernate,Spring,Cocoon等其他开源框架。

    缓存回收就是当缓存满了的时候,Ehcache会根据指定的策略来清理缓存。这里的缓存回收策略有别与Ehcache中的失效清理策略。失效清理策略是对失效的Element进行批量清理时所采用的策略,最终所有失效的Element都将被清理,只不过是清理的先后顺序不同罢了。Ehcache中缓存的最大Element数是由maxElementsInMemory来指定的。当缓存中的Element个数达到maxElementsInMemory指定的值时,Ehcache会根据具体的策略来清理缓存,默认的策略是LRU(最近最少使用)。

    磁盘缓存大小默认是没有限制的,不过可通过maxElementsOnDisk来指定。当磁盘缓存达到maxElementsOnDisk指定的值时,Ehcache会清理磁盘中的缓存使用默认策略是LFU(使用频率最低)。

     Ehcache的类层次模型

     Ehcache的类层次模型主要为三层,最上层的是CacheManager,它是操作Ehcache的入口。我们可以通过CacheManager.getInstance()获得一个单个的CacheManager,或者通过CacheManager的构造函数创建一个新的CacheManager.每个CacheManager都管理着多个Cache。而每个Cache都以一种类Hash的方式,关联着多个Element。而Element则是我们用于存放要缓存内容的地方。

    Ehcache的刷新策略

    ehcache的刷新策略是当缓存在放入的时候记录一个放入时间,它是用Lazy Evict的方式,在取的时候同设置的TTL比较 。

    MemoryStore回收策略

    MemoryStore支持三种策略:LRU、LFU、FIFO。

    1.LRU:最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清除缓存。

    2.LFU:最少被使用,缓存的元素有一个hit属性,hit值最小的将会被清除缓存。

    3.FIFO:先进先出。 

     事件处理

    可以为CacheManager添加事件监听,当对CacheManager增删Cache时,事件处理器将会得到通知。要配置事件处理,需要通过ehcache的配置文件来完成。可以为Cache添加事件监听,当对Cache增删Element时,事件处理器将会得到通知。要配置事件处理,需要通过ehcache的配置文件来完成。

    ehcache参数配置

    eternal - 设置元素(内存中对象)是否永久驻留。如果是,将忽略超时限制且元素永不消亡。

    timeToIdleSeconds - 设置某个元素消亡前的停顿时间。也就是在一个元素消亡之前,两次访问时间的最大时间间隔值。这只能在元素不是永久驻留时有效(译注:如果对象永恒不灭,则设置该属性也无用 )。 如果该值是0就是意味着元素不是永久驻留时有效。

     timeToLiveSeconds - 为元素设置消亡前的生存时间。也就是一个元素从构建到消亡的最大时间间隔值。这只能在元素不是永久驻留时有效。

    overflowToDisk  - 设置当内存中缓存达到maxInMemory 限制时元素是否可写到磁盘上。

    1. ehcache使用了LinkedHashMap来存放Element。jdk要1.5以上。Ehcache1.5可以使用jdk1.4

    2.如果在添加Elemtent时,缓存中的Element个数达到了最大缓存数并且overflowToDisk配置的属性为true,Ehcache会更具配置项MemoryStoreEvictionPolicy的失效策略将Element输出到磁盘。如果overflowToDisk为fasle,Ehcache将删除内存中Element

    3.值得注意的是缓存中失效的Element并不会别马上清理掉,所以想得到内存的真实大小应该调用方法calculateInMemorySize()方法。

    4.一个ehcache.xml对应一个CacheManage。

    5.不同的缓存应该对应不同的硬盘上的路径,否则会报错。

    6.注意要想使用磁盘缓存,缓存的Element必须实现序列化接口。否则会抛出NotSerializableException异常。

    7.Ehcache会将每个缓存配置的文件路径下创建一个cache_name.data文件,如果使用的磁盘持久化技术,还会生成一个cache name.index文件。

    8.Ehcache有一个后台线程专门做Ellment失效监测以及清除工作。设置线程运行间隔时间,可通过设置diskExpiryThreadIntervalSeconds属性来完成,此值不宜设置过低,否则会导致清理线程占用大量CPU资源。默认值是120秒。

    9.持久化可在Element的diskPersistent配置项中配置,如果配置为“false”或是“omitted”在CacheManager shutdown或是startup后,用来缓存Element的文件将被清除掉。如果设置为“true”,data和index文件会被保存下来,对于新创建的CacheManager Element也是可用的。

    10.使用时必须显示调用cache. Flush()才会将数据缓存到磁盘中。

    11.磁盘缓存步骤:从MemoryStore中把没有失效的Element刷新到DiskStore,Element被写入到data文件,Element将被序列化到index文件。

    12.磁盘缓存大小默认是没有限制的,不过可通过maxElementsOnDisk来指定。当磁盘缓存达到maxElementsOnDisk指定的值时,Ehcache会清理磁盘中的缓存使用默认策略是LFU(使用频率最低)。

    13.在使用完Ehcache后,必须要shutdown缓存。Ehcache中有自己的关闭机制,不过最好在你的代码中显示调用CacheManager.getInstance().shutdown();

    14.Cache:对于getValue()能取到可序列化的值;getObjectValue()取得非序列化的值。

    15.cache.getSize();得到缓存中元素的个数;获得当前MemoryStore中的element数量:cache.getMemoryStoreSize();获得当前DiskStore中element数量:cache.getDiskStoreSize()。

    16.在使用完Ehcache后,必须要shutdown缓存。Ehcache中有自己的关闭机制,不过最好在你的代码中显示调用CacheManager.getInstance().shutdown();

  • 相关阅读:
    司马光 王安石
    辛弃疾
    伯仲叔季
    三国时代
    西汉 东汉 三国(曹魏 蜀汉 东吴)
    数量关系练习题
    为什么不推荐使用外键约束
    Google Map API申请
    Android传感器——加速度传感器
    第三届空间信息智能服务研讨会
  • 原文地址:https://www.cnblogs.com/leehongee/p/2413106.html
Copyright © 2011-2022 走看看