SpringBoot集成Ehcache缓存

SpringBoot集成Ehcache缓存

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

你可能感兴趣的:(缓存,缓存,spring,boot,java)