转ehcache 基本原理
hjp222 发表于2011-03-22 16:30 最后修改于2011-05-16 15:32 浏览(105) 评论(0) 分类:ehcache     举报
  ehcache是一个用Java实现的使用简单,高速,实现线程安全的缓存管理类库,ehcache提供了用内存,磁盘文件存储,以及分布式存储方式等多种灵活的cache管理方案。同时ehcache作为开放源代码项目,采用限制比较宽松的Apache License V2.0作为授权方式,被广泛地用于Hibernate,  Spring,Cocoon等其他开源系统。
  Ehcache的类层次模型主要为三层,最上层的是CacheManager,他是操作Ehcache的入口。我们可以通过Instance()获得一个单个的CacheManager,或者通过CacheManager的构造函数创建一个新的CacheManager。每个CacheManager都管理着多个Cache。而每个Cache都以一种类Hash的方式,关联着多个Elemenat。而Element则是我们用于存放要缓存内容的地方。
ehcache的刷新策略
ehcache的刷新策略是当缓存在放入的时候记录一个放入时间,它是用Lazy Evict的方式,在取的时候同设置的TTL比较
ehcache缓存的3种清空策略:
1 FIFO,先进先出
2 LFU,最少被使用,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。
3 LRU,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
事件处理
可以为CacheManager添加事件监听,当对CacheManager增删Cache时,事件处理器将会得到通知。要配置事件处理,需要通过ehcache的配置文件来完成。
可以为Cache添加事件监听,当对Cache增删Element时,事件处理器将会得到通知。要配置事件处理,需要通过ehcache的配置文件来完成。
ehcache参数配置:
maxInMemory - 设定内存中创建对象的最大值。
eternal - 设置元素(译注:内存中对象)是否永久驻留。如果是,将忽略超时限制且元素永不消亡。
timeToIdleSeconds - 设置某个元素消亡前的停顿时间。也就是在一个元素消亡之前,两次访问时间的最大时间间隔值。这只能在元素不是永久驻留时有效(译注:如果对象永恒不灭,则设置该属性也无用)。
如果该值是 0 就意味着元素可以停顿无穷长的时间。
timeToLiveSeconds - 为元素设置消亡前的生存时间。也就是一个元素从构建到消亡的最大时间间隔值。这只能在元素不是永久驻留时有效。
overflowToDisk  - 设置当内存中缓存达到maxInMemory 限制时元素是否可写到磁盘上。
1. ehcache使用了LinkedHashMap来存放Element。jdk要1.5以上。Ehcache1.5可以使用jdk1.4
2. 如果在添加Elemtent时,缓存中的Element个数达到了最大缓存数并且overflowToDisk配置的属性为trueEhcache会更具配置项MemoryStoreEvictionPolicy的失效策略将Element输出到磁盘。如果overflowToDiskfasleEhcache将删除内存中Element
3. 值得注意的是缓存中失效的Element并不会别马上清理掉,所以想得到内存的真实大小应该调用方法calculateInMemorySize()方法。
4. 一个l对应一个CacheManager
5. 不同的缓存应该对应不同的硬盘上的路径,否则会报错
6. 注意要想使用磁盘缓存,缓存的Element必须实现序列化接口。否则会抛出NotSerializableException异常。
7. Ehcache会将每个缓存配置的文件路径下创建一个cache_name.data文件,如果使用的磁盘持久化技术,还会生成一个cache name.index文件。
8. Ehcache有一个后台线程专门做Ellment失效监测以及清除工作。设置线程运行间隔时间,可通过设置diskExpiryThreadIntervalSeconds属性来完成,此值不宜设置过低,否则会导致清理线程占用大量CPU资源。默认值是120秒。
9. 持久化可在ElementdiskPersistent配置项中配置,如果配置为“false”或是“omitted
CacheManager shutdown或是startup后,用来缓存Element的文件将被清除掉。如果设置为“true”,dataindex文件会被保存下来,对于新创建的CacheManager Element也是可用的。
10. 使用时必须显示调用cache. Flush()才会将数据缓存到磁盘中。
11. 磁盘缓存步骤:从MemoryStore中把没有失效的Element刷新到DiskStore,Element被写入到data文件,Element将被序列化到index文件。
12. 磁盘缓存大小默认是没有限制的,不过可通过maxElementsOnDisk来指定。当磁盘缓存达到maxElementsOnDisk指定的值时,Ehcache会清理磁盘中的缓存使用默认策略是LFU(使用频率最低)。
13. 在使用完Ehcache后,必须要shutdown缓存。Ehcache中有自己的关闭机制,不过最好在你的代码中显示调用Instance().shutdown();
14. Cache:对于getValue()能取到可序列化的值;getObjectValue()取得非序列化的值
15. Size();得到缓存中元素的个数;获得当前MemoryStore中的element数量:MemoryStoreSize();获得当前DiskStoreelement数量:DiskStoreSize();
16. 在使用完Ehcache后,必须要shutdown缓存。Ehcache中有自己的关闭机制,不过最好在你的代码中显示调用Instance().shutdown();
17. ehcache-core-1.61.7没有任何依赖;ehcache1.7.1依赖SLF4J,以及相应的log的jar包。
18. CacheManager可以通过单例(factory的静态方法)或者构造函数(constructors)创建。分别叫做single model和instance model。当两种情况都有的时候,系统会采用单例模式,构造器每次都生成单例模式
19. 对于想存储数据到硬盘,或者集时复制到其他缓存区域的数据,必须可序列化。如果不可序列化,该数据在进行上述操作时会被丢弃,且没有报错,只是在debug级别有日志信息。
20. 读取cache的数据,有以下几种方式:
Cache-aside: 直接操作数据
Cache-as-sor:read-through、write-through和write-behind的结合
Read-through:
Write-through:
Write-behind:
21. 从ehcache2.0开始,以下属性可以在运行时改变:
• timeToLive
• timeToIdle
• maxElementsInMemory
• maxElementsOnDisk
bootstrap 5
• memory store eviciton policy
• CacheEventListeners can be added and removed dynamically []
  当eternal属性为“true”时,timeToLive和timeToIdle会失效
22. 以下代码演示怎么运行时修改缓存属性
This example shows how to dynamically modify the cache configuration of an already running cache:
Cache cache = Cache("sampleCache");
CacheConfiguration config = CacheConfiguration();
config.setTimeToIdleSeconds(60);
config.setTimeToLiveSeconds(120);
config.setMaxElementsInMemory(10000);
config.setMaxElementsOnDisk(1000000);
Dynamic cache configurations can also be frozen to prevent future changes:
Cache cache = Cache("sampleCache");
cache.disableDynamicFeatures();
23. 2.5之前是通过元素的个数来表示内存或者硬盘的大小;2.5之后,通过字节数来表示。2.5暂时还没有出来。新属性将会是:
The new cache attributes are:
• maxBytesOnHeap
• maxBytesOffHeap (formerly maxMemoryOffHeap)
  • maxBytesOnDisk
甚至,还可以指定比例,如:maxBytesOnHeap="20%".
24. Ehcache可以将一些数据一直放到缓存或者堆栈或者硬盘或者terracotta的L2中。主要是为了满足Hibernate等一些情况下的需求。但是,这样很容易造成内存溢出的错误
25. 当缓存刚启动时,ehcache提供一个机制可以先加载数据:BootstrapCacheLoader
<bootstrapCacheLoaderFactory
class="net.sf.ehcache.distribution.jgroups.JGroupsBootstrapCacheLoaderFactory"