Ehcache有两种缓存方式,分别是堆内存、磁盘(非堆内存)。
一、堆内存缓存。也就是MemoryStore,速度最快,不适合存放大量数据。Ehcache规定在使用Cache时必须在CacheManager级别指定可用的内存大小或者是在Cache级别指定可用的内存大小或所允许存放的元素的最大数量。在CacheManager级别指定的内存大小是其内部所有Cache一起所能使用的内存的最大量。CacheManager级别指定内存大小是通过maxBytesLocalHeap来指定的
maxEntriesLocalHeap和maxBytesLocalHeap不能同时使用。
驱除策略:memoryStoreEvictionPolicy。三种选项:LRU(最近最少使用)、LFU(最不常使用)、FIFO(先进先出)
元素过期:timeToLiveSeconds(在不被请求的情况下存在的最长时间秒)、timeToIdleSeconds(在缓存中允许存在的最长时间秒)、eternal(是否永恒true or false)。其中选择eternal其他两项失效
二、磁盘缓存。可以创建很大的缓存。在保存时Ehcache会对元素进行序列化再保存到BigMemory中,然后在读取的时候又会把读取到的字节进行反序列化。需要指定磁盘目录进行存储。
指定容量:CacheManager级别通过maxBytesLocalDisk来指定,Cache级别通过maxBytesLocalDisk和maxEntriesLocalDisk指定
磁盘位置:diskStore元素。
驱除策略和元素过期与内存缓存相同
一、pom
<!‐‐ Spring Boot 缓存支持启动器 ‐‐>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐cache</artifactId>
</dependency>
<!‐‐ Ehcache 坐标 ‐‐>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.10.6</version>
</dependency>
二、application
spring:
cache:
type: ehcache
ehcache:
config: classpath:ehcache.xml
三、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="false">
<diskStore path = "Java.io.tmpdir"/>
<defaultCache
eternal="false" <‐‐意味着该缓存会死亡‐‐>
maxElementsInMemory="900"<‐‐缓存的最大数目‐‐>
overflowToDisk="false" <‐‐内存不足时,是否启用磁盘缓存,如果为true则表示启动磁
盘来存储,如果为false则表示不启动磁盘‐‐>
diskPersistent="false"
timeToIdleSeconds="0" <‐‐当缓存的内容闲置多少时间销毁‐‐>
timeToLiveSeconds="60" <‐‐当缓存存活多少时间销毁(单位是秒,如果我们想设置2
分钟的缓存存活时间,那么这个值我们需要设置120)‐‐>
memoryStoreEvictionPolicy="LRU" <‐‐自动销毁策略‐‐>
/>
<cache
name="users"
eternal="false"
maxElementsInMemory="200"
overflowToDisk="false"
diskPersistent="false"
timeToIdleSeconds="0"
timeToLiveSeconds="60"
memoryStoreEvictionPolicy="LRU"
/>
<cache name="licenseCache"
eternal="false"
maxElementsInMemory="10"
overflowToDisk="false"
diskPersistent="false"
timeToIdleSeconds="0"
timeToLiveSeconds="3600"
memoryStoreEvictionPolicy="LRU"
/>
</ehcache>
<!‐‐<diskStore>==========当内存缓存中对象数量超过maxElementsInMemory时,将缓
存对象写到磁盘缓存中(需对象实现序列化接口) ‐‐>
<!‐‐<diskStore path="">==用来配置磁盘缓存使用的物理路径,Ehcache磁盘缓存使用的
文件后缀名是*.data和*.index ‐‐>
<!‐‐name=================缓存名称,cache的唯一标识(ehcache会把这个cache放到Ha
shMap里) ‐‐>
<!‐‐maxElementsOnDisk====磁盘缓存中最多可以存放的元素数量,0表示无穷大 ‐‐>
<!‐‐maxElementsInMemory==内存缓存中最多可以存放的元素数量,若放入Cache中的元素
超过这个数值,则有以下两种情况 ‐‐>
<!‐‐1)若overflowToDisk=true,则会将Cache中多出的元素放入磁盘文件中 ‐‐>
<!‐‐2)若overflowToDisk=false,则根据memoryStoreEvictionPolicy策略替换Cache
中原有的元素 ‐‐>
<!‐‐eternal==============缓存中对象是否永久有效,即是否永驻内存,true时将忽略ti
meToIdleSeconds和timeToLiveSeconds ‐‐>
<!‐‐timeToIdleSeconds====缓存数据在失效前的允许闲置时间(单位:秒),仅当
eternal=false时使用,默认值是0表示可闲置时间无穷大,此为可选属性 ‐‐>
<!‐‐即访问这个cache中元素的最大间隔时间,若超过这个时间没有访问此Cache中的某个
元素,那么此元素将被从Cache中清除 ‐‐>
<!‐‐timeToLiveSeconds====缓存数据在失效前的允许存活时间(单位:秒),仅当
eternal=false时使用,默认值是0表示可存活时间无穷大 ‐‐>
<!‐‐即Cache中的某元素从创建到清楚的生存时间,也就是说从创建开始计时,当超过这个
时间时,此元素将从Cache中清除 ‐‐>
<!‐‐overflowToDisk=======内存不足时,是否启用磁盘缓存(即内存中对象数量达到maxE
lementsInMemory时,Ehcache会将对象写到磁盘中) ‐‐>
<!‐‐会根据标签中path值查找对应的属性值,写入磁盘的文件会放在path文件夹下,文件
的名称是cache的名称,后缀名是data ‐‐>
<!‐‐diskPersistent=======是否持久化磁盘缓存,当这个属性的值为true时,系统在初始
化时会在磁盘中查找文件名为cache名称,后缀名为index的文件 ‐‐>
<!‐‐这个文件中存放了已经持久化在磁盘中的cache的index,找到后会把cache加载到内
存 ‐‐>
<!‐‐要想把cache真正持久化到磁盘,写程序时注意执行net.sf.ehcache.Cache.put(El
ement element)后要调用flush()方法 ‐‐>
<!‐‐diskExpiryThreadIntervalSeconds==磁盘缓存的清理线程运行间隔,默认是120秒
‐‐>
<!‐‐diskSpoolBufferSizeMB============设置DiskStore(磁盘缓存)的缓存区大小,
默认是30MB ‐‐>
<!‐‐memoryStoreEvictionPolicy========内存存储与释放策略,即达到maxElementsIn
Memory限制时,Ehcache会根据指定策略清理内存 ‐‐>
<!‐‐共有三种策略,分别为LRU(Least Recently Used 最近最少使用)、LFU(Less Fre
quently Used最不常用的、FIFO(first in first out先进先出) ‐‐>
四、存取注解使用
public class EhcacheDataServiceImpl implements EhcacheDataService {
@Override
@Cacheable(key = "'AccessToken'")
public AccessToken getAccessToken() {
log.info("正在请求");
return getTokenFromZvizer();
}
@Override
@CachePut(key = "'AccessToken'")
public AccessToken updateAccessToken() {
log.info("正在更新");
return getTokenFromZvizer();
}
//@CacheEvict 用于delete
}
五、启动
方法和启动类添加注解@EnableCaching