一、XML配置文件

  1. ehcache 默认会在 classpath 下查找名为 ehcache.xml 的文件,当然也可以自定义名称。
  2. 如果没有找到 ehcache.xml,ehcache 会默认试用 ehcache-failsafe.xml,它被打包在 ehcache 的 jar 文件中。如果用户使用的是这个文件,ehcache 会报一个警告,让用户自己定义一个配置文件。
  3. defaultCache 配置会被应用到所有没有被显示声明的缓存中。这个配置不是必需的。

二、动态改变配置

  1. 禁用动态改变配置:
    • 在 XML 文件中把属性 dynamicConfig 设置为 false。
    • 在代码中禁用:
        Cache cache = manager.getCache("sampleCache");
        cache.disableDynamicFeatures();
      
  2. 可以动态改变的配置:
    • 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);
      

三、传递拷贝而非引用

默认情况下 get() 方法会取得缓存中数据的引用,之后对这个数据的所有改变都会立刻反映到缓存中。有些时候用户想要获得一个缓存数据的拷贝,对这个拷贝的操作不会影响到缓存。

  1. XML 配置: 把 copyOnReadcopyOnWrite 设置为 true
<cache name="copyCache"
 maxEntriesLocalHeap="10"
 eternal="false"
 timeToIdleSeconds="5"
 timeToLiveSeconds="10"
 copyOnRead="true"
 copyOnWrite="true">
 <copyStrategy class="com.company.ehcache.MyCopyStrategy"/>
</cache>
  1. Java 代码中:
CacheConfiguration config = new CacheConfiguration("copyCache", 1000).copyOnRead(true).copyOnWrite(true);
Cache copyCache = new Cache(config);

get() 或者 put() 方法获得拷贝的时候,可以自定义拷贝策略

  1. 实现接口 net.sf.ehcache.store.compound.CopyStrategy
  2. XML 中配置 <copyStrategy class="com.company.ehcache.MyCopyStrategy"/>
  3. Java 代码中:
    CacheConfiguration cacheConfiguration = new CacheConfiguration("copyCache", 10);
    CopyStrategyConfiguration copyStrategyConfiguration = new CopyStrategyConfiguration();
    copyStrategyConfiguration.setClass("com.company.ehcache.MyCopyStrategy");
    cacheConfiguration.addCopyStrategy(copyStrategyConfiguration);
    

四、存储层级

  1. 内存存储:在堆内存里存储。从属于 Java GC。
  2. 非堆存储:受限于 RAM 的可用空间。
    • 不从属于 Java GC。
    • 只能存储序列化的数据。
    • 为内存存储提供了溢出能力。
  3. 磁盘存储。
    • 备份内存存储。
    • 为非堆存储提供溢出能力。
    • 只能存储序列化的数据。

五、存储详细介绍

  1. 内存存储:在堆内存分配空间。在不引起 GC 停顿的前提下,尽可能分配空间。利用非堆内存存储溢出的数据(为了不引起 GC 停顿)。
    • 速度是最快的。
    • 接受所有数据,无论有没有实现 Serializable
    • 线程安全
    • 如果数据量超过了存储最大值:(1)配置了溢出策略,数据可以被保存到其他层级;(2)没有配置,一部分数据被删除。
    • 内存回收策略:
      • LRU(最近最少使用):默认策略。缓存的时间戳离当前时间最远的将被回收。
      • LFU(最少被使用):缓存有一个 hit 值,值最小的被回收。
      • FIFO(先进先出)
  2. 磁盘存储
    • 仅能存储实现了 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"/>
    
  • 禁用磁盘存储:不要在文件里配置 diskStore