ehcache基本原理
(2014-12-29 11:03:33)
标签:
ehcache非堆缓存持久化rmi内存存储 |
分类: 分布式 |
ehcache是一个用Java实现的使用简单,高速,实现线程安全的缓存管理类库,ehcache提供了用内存,磁盘文件存储,以及分布式存储方式等多种灵活的cache管理方案。同时ehcache作为开放源代码项目,采用限制比较宽松的Apache
License V2.0作为授权方式,被广泛地用于Hibernate,
Ehcache的类层次模型主要为三层,最上层的是CacheManager,他是操作Ehcache的入口。我们可以通过CacheManager.getInstance()获得一个单个的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
-
1.
-
如果在添加Elemtent时,缓存中的Element个数达到了最大缓存数并且overflowToDisk配置的属性为true,Ehcache会更具配置项MemoryStoreEvictionPolic
y 的失效策略将Element输出到磁盘。如果overflowToDisk为fasle,Ehcache将删除内存中Element - 值得注意的是缓存中失效的Element并不会别马上清理掉,所以想得到内存的真实大小应该调用方法calculateInMemorySize()方法。
- 一个ehcache.xml对应一个CacheManager
- 不同的缓存应该对应不同的硬盘上的路径,否则会报错
-
注意要想使用磁盘缓存,缓存的Element必须实现序列化接口。否则会抛出NotSerializableException
异常。 - Ehcache会将每个缓存配置的文件路径下创建一个cache_name.data文件,如果使用的磁盘持久化技术,还会生成一个cache name.index文件。
-
8.
Seconds属性来完成,此值不宜设置过低,否则会导致清理线程占用大量CPU资源。默认值是120秒。 -
9.
- 使用时必须显示调用cache. Flush()才会将数据缓存到磁盘中。
- 磁盘缓存步骤:从MemoryStore中把没有失效的Element刷新到DiskStore,Element被写入到data文件,Element将被序列化到index文件。
-
12.
-
13.
-
14.
-
15.
-
16.
-
17.
-
18.
-
19.
-
20.
Cache-aside:
Cache-as-sor:read-through、write-through和write-behind的结合
Read-through:
Write-through:
Write-behind:
-
21.
• timeToLive
• timeToIdle
• maxElementsInMemory
• maxElementsOnDisk
• memory store eviciton policy
• CacheEventListeners can be added and removed dynamically []
-
22.
This example shows how to dynamically modify the cache configuration of an already running cache:
Cache cache = manager.getCache("sampleCache");
CacheConfiguration config = cache.getCacheConfiguration();
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 = manager.getCache("sampleCache");
cache.disableDynamicFeatures();
-
23.
The new cache attributes are:
• maxBytesOnHeap
• maxBytesOffHeap (formerly maxMemoryOffHeap)
• maxBytesOnDisk
甚至,还可以指定比例,如:maxBytesOnHeap="20%".
-
24.
-
25.
class="net.sf.ehcache.distribution.jgroups.JGroupsBootstrapCacheLoa
properties="bootstrapAsynchronously=true"/>
DiskStoreBootstrapCacheL
class="net.sf.ehcache.store.DiskStoreBootstrapCacheL
properties="bootstrapAsynchronously=true"/>
TerracottaBootstrapCache
class="net.sf.ehcache.store.TerracottaStoreBootstrap
properties="bootstrapAsynchronously=true"/>
-
26.
CacheConfiguration config = new CacheConfiguration("copyCache", 1000).copyOnRead(true)
Cache copyCache = new Cache(config);
maxElementsInMemory="10"
eternal="false"
timeToIdleSeconds="5"
timeToLiveSeconds="10"
- overflowToDisk="false"
copyOnRead="true"
copyOnWrite="true">
com.company.ehcache.MyCopyStrategy"/>
-
27.
在ehcache启动的时候,可以设置缓存失效。命令行启动的时候如下:
java -Dnet.sf.ehcache.disabled=true
其他特殊的系统属性:
1)java -Dnet.sf.ehcache.use.classic.lru=true
当LRU被选中的时候,更老的LruMemoryStore实现策略将会被真正采用
-
28.
-
29.
-
30.
1)通过系统参数:-Dnet.sf.ehcache.skipUpdateCheck=true
2)通过配置文件:
xsi:noNamespaceSchemaLocatio
updateCheck="false" monitoring="autodetect"
dynamicConfig="true">
-
31.
-
32.
-
33.
1)
2)
3)
-
34.
其本质是使用java的LinkedHashMap来实现的。多线程安全、内存管理安全、速度快
-
35.
-
36.
Seconds 属性可以设置该线程执行的间隔时间(默认是120秒,不能太小,以免影响效率). -
37.
Terracotta BigMemory是一个新增的功能,它允许系统占用堆以外的内存,速度是硬盘存储的100倍,允许很大的存储空间被创建(350G被测试过)
因为非堆数据是以字节流的形式存储,所以要求Element的key和value都要是可以序列化的。
因为序列化和反序列化的过程,这种存储形式比内存存储慢10倍
-
38.
线程安全的
-
39.
-
40.
-
41.
-
42.
Considerations for guidance on how to safely shut the Virtual Machine down.
When a DiskStore is persisted, the following steps take place:
- • Any non-expired Elements of the MemoryStore are flushed to the DiskStore
- • Elements awaiting spooling are spooled to the data file
- • The free list and element list are serialized to the index file
On startup the following steps take place:
- • An attempt is made to read the index file. If it does not exist or cannot be read successfully, due to disk corruption, upgrade of ehcache, change in JDK version etc, then the data file is deleted and the DiskStore starts with no Elements in it.
- • If the index file is read successfully, the free list and element list are loaded into memory. Once this is done, the index file contents are removed. This way, if there is a dirty shutdown, when restarted, Ehcache will delete the dirt index and data files.
- • The DiskStore starts. All data is available.
- • The expiry thread starts. It will delete Elements which have expired.
-
43.
把一个拥有8G机器内存的存储分配成各种存储。设想有一个7G的数据集,共7M个元素,每个元素1k大小。
我们设置1G的堆存储和7G的非堆存储:
java -Xms1G -Xmx1G -XX:maxDirectMemorySize=7G
对应的配置文件为:
maxElementsInMemory=100
overflowToOffHeap="true"(企业)
maxMemoryOffHeap="7G"
... />
-
44.
• Glassfish V2/V3
• Tomcat 6
• Jetty 6
Tomcat 6通过了所有的继集成测试
支持Weblogic10.3.2,但是SOAP不兼容。
-
45.
-
46.
-
47.
缓存属性:
缓存配置。
以下属性是必须的:
name
maxElementsInMemory
maxElementsOnDisk
eternal
overflowToDisk
以下属性是可选的:
timeToIdleSeconds
timeToLiveSeconds
diskPersistent
(测试一下true的情况?重载vm的时候会从磁盘进行序列化到对象)
diskExpiryThreadInterval
memoryStoreEvictionPolic
*cacheEventListenerFactor
*bootstrapCacheLoaderFact
Ehcache内建了基于RMI的实现