一、XML配置文件
ehcache
默认会在classpath
下查找名为ehcache.xml
的文件,当然也可以自定义名称。- 如果没有找到
ehcache.xml
,ehcache 会默认试用ehcache-failsafe.xml
,它被打包在 ehcache 的jar
文件中。如果用户使用的是这个文件,ehcache 会报一个警告
,让用户自己定义一个配置文件。 defaultCache
配置会被应用到所有没有被显示声明的缓存中。这个配置不是必需的。
二、动态改变配置
禁用
动态改变配置:- 在 XML 文件中把属性 dynamicConfig 设置为 false。
- 在代码中禁用:
Cache cache = manager.getCache("sampleCache"); cache.disableDynamicFeatures();
- 可以动态改变的配置:
- timeToLive:一个 element 在
缓存中存在
的最长时间(秒),不论它是否被访问过都会被清除。 - timeToIdle:一个 element
未被访问
的最长时间(秒),经过这段时间后被清除。 - maxEntriesLocalHeap
- maxBytesLocalHeap
- maxEntriesLocalDisk
- maxBytesLocalDisk
Cache cache = manager.getCache("sampleCache"); CacheConfiguration config = cache.getCacheConfiguration(); config.setTimeToIdleSeconds(60); config.setTimeToLiveSeconds(120); config.setmaxEntriesLocalHeap(10000); config.setmaxEntriesLocalDisk(1000000);
- timeToLive:一个 element 在
三、传递拷贝而非引用
默认情况下 get()
方法会取得缓存中数据的引用,之后对这个数据的所有改变都会立刻反映到缓存中。有些时候用户想要获得一个缓存数据的拷贝
,对这个拷贝的操作不会影响到缓存。
- XML 配置: 把
copyOnRead
和copyOnWrite
设置为true
<cache name="copyCache"
maxEntriesLocalHeap="10"
eternal="false"
timeToIdleSeconds="5"
timeToLiveSeconds="10"
copyOnRead="true"
copyOnWrite="true">
<copyStrategy class="com.company.ehcache.MyCopyStrategy"/>
</cache>
- Java 代码中:
CacheConfiguration config = new CacheConfiguration("copyCache", 1000).copyOnRead(true).copyOnWrite(true);
Cache copyCache = new Cache(config);
在 get()
或者 put()
方法获得拷贝的时候,可以自定义拷贝策略
。
- 实现接口
net.sf.ehcache.store.compound.CopyStrategy
。 - XML 中配置
<copyStrategy class="com.company.ehcache.MyCopyStrategy"/>
。 - Java 代码中:
CacheConfiguration cacheConfiguration = new CacheConfiguration("copyCache", 10); CopyStrategyConfiguration copyStrategyConfiguration = new CopyStrategyConfiguration(); copyStrategyConfiguration.setClass("com.company.ehcache.MyCopyStrategy"); cacheConfiguration.addCopyStrategy(copyStrategyConfiguration);
四、存储层级
- 内存存储:在
堆内存
里存储。从属于 Java GC。 - 非堆存储:受限于
RAM
的可用空间。- 不从属于 Java GC。
- 只能存储序列化的数据。
- 为内存存储提供了溢出能力。
- 磁盘存储。
- 备份内存存储。
- 为非堆存储提供溢出能力。
- 只能存储序列化的数据。
五、存储详细介绍
- 内存存储:在堆内存分配空间。在不引起 GC 停顿的前提下,尽可能分配空间。利用
非堆内存
存储溢出的数据(为了不引起 GC 停顿)。- 速度是
最快
的。 - 接受所有数据,无论有没有实现
Serializable
。 线程安全
。- 如果数据量超过了存储最大值:(1)配置了溢出策略,数据可以被保存到其他层级;(2)没有配置,一部分数据被删除。
- 内存回收策略:
- LRU(最近最少使用):默认策略。缓存的时间戳
离当前时间最远
的将被回收。 - LFU(最少被使用):缓存有一个 hit 值,
值最小
的被回收。 - FIFO(先进先出)
- LRU(最近最少使用):默认策略。缓存的时间戳
- 速度是
- 磁盘存储
- 仅能存储实现了
Serializable
接口的数据。其他数据会抛出NotSerializableException
异常。 - 磁盘存储是可选的,不一定要配置;如果有多个 CacheManager,也没有必要配置多个磁盘存储路径。
- 磁盘存储选项:
- localTempSwap:允许缓存存放到磁盘,但重启之后这些数据就会丢失。
- localRestartable:重启之后数据不会丢失,会自动加载到内存中。
- 仅能存储实现了
<persistence strategy="localTempSwap" />
- 磁盘存储路径:
- user.home:用户
home
目录。 - user.dir:用户当前的活动目录。
- java.io.tmpdir:默认的临时目录。
- ehcache.disk.store.dir:命令行中指定的系统属性。
<diskStore path="/path/to/store/data"/>
- user.home:用户
- 禁用磁盘存储:不要在文件里配置
diskStore
。