Ehcache 使用起来很简单,是一个 key/value
容器,和 Map 很像,只不过功能比 Map 丰富,能够限定缓存中元素的个数,自动删除超时的元素,把元素持久化到硬盘等:
- 添加元素到缓存:
cache.put(new Element("username", "Biao"))
- 从缓存获取元素:
cache.get("username")
- 从缓存删除元素:
cache.remove("username")
- CacheManager 管理多个 Cache,每个 Cache 里又管理多个缓存的元素 Element
目录结构:
1 | ├── main |
Maven 依赖
1 | compile 'net.sf.ehcache:ehcache:2.10.3' |
ehcache.xml
1 | <ehcache updateCheck="false" name="fooCache"> |
使用 EhCache
1 | import net.sf.ehcache.Cache; |
输出:
1 | [ key = username, value=Biao, version=1, hitCount=1, CreationTime = 1480225511239, LastAccessTime = 1480225511240 ] |
Ehcache 的配置参数
Attribute or Tag | Description |
---|---|
name | 缓存名称 |
maxElementsInMemory | 缓存元素的最大数量 |
eternal | 对象是否永久有效,一但设置了,timeout 将不起作用 (eternal: 永恒的) |
timeToIdleSeconds | 设置对象在失效前的允许闲置时间(单位: 秒)。仅当 eternal=false 对象不是永久有效时使用,可选属性,默认值是 0,也就是可闲置时间无穷大。get(), put() 都会更新元素的最后访问时间,例如 timeToIdleSeconds=10,元素的 key 为 username, 在 10 秒内没有 get() 和 put() 操作的话,username 对应的元素就会过期,从缓存中删除,再次访问的时候得到的是 null |
timeToLiveSeconds | 设置对象在失效前允许存活时间(单位: 秒)。最大时间介于创建时间和失效时间之间。仅当 eternal=false 对象不是永久有效时使用,默认是 0,也就是对象存活时间无穷大。 例如 timeToLiveSeconds=10,则元素在创建 10 秒后不管有没有被访问,都会过期 |
overflowToDisk | 当内存中对象数量超过 maxElementsInMemory 时,Ehcache 将会对象写到磁盘中 |
diskSpoolBufferSizeMB | 这个参数设置 DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区 |
maxElementsOnDisk | 硬盘最大缓存个数 |
diskPersistent | 是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false |
diskExpiryThreadIntervalSeconds | 磁盘失效线程运行时间间隔,默认是120秒 |
memoryStoreEvictionPolicy | 当达到 maxElementsInMemory 限制时,Ehcache 将会根据指定的策略去清理内存。默认策略是 LRU(最近最少使用)。你可以设置为 FIFO(先进先出)或是 LFU(较少使用) |
clearOnFlush | 内存数量最大时是否清除 |
<cacheEventListenerFactory> |
设置事件监听器,监听缓存中元素的添加,更新,删除等事件 |
自定义 CacheEventListener
添加,更新,删除元素等的时候都有相应的事件,可以自定义事件监听器来监听这些事件:
- 实现接口
CacheEventListener
,实现事件对应的方法 - 实现接口
CacheEventListenerFactory
,创建监听器 - 配置文件里使用
<cacheEventListenerFactory>
注册事件监听器工厂 - 事件发生的时候监听器里对应的方法会被自动调用
ehcache.xml
设置缓存 fox 的 timeToIdleSeconds 为 3 秒,这样缓存里的元素只要一不使用,很快就过期了。
1 | <ehcache updateCheck="false" name="fooCache"> |
MyCacheEventListener
1 | import net.sf.ehcache.CacheException; |
MyCacheEventListenerFactory
1 | import net.sf.ehcache.event.CacheEventListener; |
使用 EhCache + 事件监听器
1 | import net.sf.ehcache.Cache; |
输出:
1 | notifyElementPut: [ key = password, value=S--S, version=1, hitCount=0, CreationTime = 1455261752745, LastAccessTime = 1455261752745 ] |