简介
ehcache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider
它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,支持REST和SOAP api等特点
主要特性
- 快速、简单
- 多种缓存策略 提供LRU、LFU和FIFO缓存策略
- 缓存数据有两级:内存和磁盘,因此无需担心容量问题
- 缓存数据会在虚拟机重启的过程中写入磁盘
- 可以通过RMI、可插入API等方式进行分布式缓存
- 具有缓存和缓存管理器的侦听接口
- 提供Hibernate的缓存实现
使用介绍
架构图
- Cache Replication:这个模块主要负责缓存同步的几种实现,主要包括TerraCotta、RMI、JMS、JGroup四种方式
- In-process APIs:这个模块主要包括Ehcache对外常用的API
- Network APIs:这个模块主要包括的是Ehcache的通信协议,主要有RESTful API、SOAP API、JMS API
- Ehcache Core:核心部分
- CacheManager: 缓存管理器,可以通过单例或者多例的方式创建,也是Ehcache的入口类
- Cache:每个CacheManager可以管理多个Cache,每个cache可以采用hash的方式管理多个Element
- Element:用于存放真正的缓存内容
缓存数据过期策略
- FIFO:根据数据的写入时间,数据先进先出
- LFU:最少被使用,缓存的元素有一个hit属性,hit值最小的将会被清出缓存
- LRU:最近最少使用,缓存的元素有一个时间戳,当缓存容量满了,现有缓存元素中时间戳离当前时间最远的元素将被清出缓存
算法名称 | 存在的问题 |
---|---|
LRU | 会存在一次冷数据的批量查询而误淘汰大量热点的数据 |
LFU | 会导致最近新加入的数据总会被很容易被剔除掉 |
FIFO | 这种算法有其特殊的使用领域,比如在作业调度、消息队列等方面 |
基本使用方法
ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="true" name="shiroCache">
<diskStore path="/data/html/ehcache/sh" /><!--达到内存上限后缓存文件保存位置-->
<defaultCache maxElementsInMemory="10000" <!--cache 中最多可以存放的元素的数量-->
eternal="false"<!--是否永驻内存。如果值是true,cache中的元素将一直保存在内存中,不会因为时间超时而丢失,所以在这个值为true的时候,timeToIdleSeconds和timeToLiveSeconds两个属性的值就不起作用了-->
timeToIdleSeconds="120"<!--访问这个cache中元素的最大间隔时间。如果超过这个时间没有访问这个cache中的某个元素,那么这个元素将被从cache中清除-->
timeToLiveSeconds="86400"<!--cache中元素的生存时间。意思是从cache中的某个元素从创建到消亡的时间,从创建开始计时,当超过这个时间,这个元素将被从cache中清除-->
overflowToDisk="true" <!--溢出是否写入磁盘-->
diskSpoolBufferSizeMB="30" <!--设置DiskStore(磁盘缓存)的缓存区大小,默认是30MB-->
maxElementsOnDisk="10000000" <!--磁盘中最大元素数量 -->
diskPersistent="false" <!--是否持久化磁盘缓存-->
diskExpiryThreadIntervalSeconds="120" <!--磁盘缓存的清理线程运行间隔-->
memoryStoreEvictionPolicy="LRU" <!--内存存储与释放策略-->
/>
<cache name="fillSettleData" maxElementsInMemory="10000" eternal="false"
timeToIdleSeconds="30" timeToLiveSeconds="30" overflowToDisk="false" />
</ehcache>
结合spring使用
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
<property name="cacheManager" ref="cacheManagerFactory" />
</bean>
<cache:annotation-driven cache-manager="cacheManager" />
<bean id="cacheManagerFactory"
class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="WEB-INF/env/ehcache.xml" />
<property name="shared" value="true" />
</bean>