一、说明
1、maven项目
2、SpringBoot项目
二、解决方案
1、引入依赖
<!--ehcache-->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.8.3</version>
</dependency>
2、增加配置文件
1)位于resources根目录
2)示例图
3)ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache name="cache" updateCheck="false">
<!-- 磁盘缓存位置 -->
<diskStore path="java.io.tmpdir"/>
<defaultCache eternal="false" maxElementsInMemory="1000"
overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="3600"
timeToLiveSeconds="3600" memoryStoreEvictionPolicy="LRU" />
<!-- 手动指定的缓存策略 -->
<!-- 对不同的数据,缓存策略可以在这里配置多种 -->
<!--sys-ku,库管理-->
<!--
diskStore path:用来配置磁盘缓存使用的物理路径
name: 缓存名称,cache的唯一标识(ehcache会把这个cache放到HashMap里)
eternal="false" 元素是否永恒,如果是就永不过期(必须设置)
maxElementsOnDisk====磁盘缓存中最多可以存放的元素数量,0表示无穷大
maxElementsInMemory="1000" 内存缓存中最多可以存放的元素数量(必须设置)
timeToIdleSeconds="0" 导致元素过期的访问间隔(秒为单位). 0表示可以永远空闲,默认为0
timeToLiveSeconds="600" 元素在缓存里存在的时间(秒为单位). 0 表示永远存在不过期
overflowToDisk="false" 当缓存达到maxElementsInMemory值是,是否允许溢出到磁盘(必须设置)
diskPersistent="false" 磁盘缓存在VM重新启动时是否保持(默认为false)
diskExpiryThreadIntervalSeconds="100" 磁盘失效线程运行时间间隔,默认是120秒
memoryStoreEvictionPolicy="LFU" 内存存储与释放策略.当达到maxElementsInMemory时
共有三种策略,分别为LRU(最近最少使用)、LFU(最常用的)、FIFO(先进先出)默认使用"最近使用"策略
-->
<cache
name="sys"
eternal="false"
maxElementsInMemory="1000"
overflowToDisk="false"
diskPersistent="false"
timeToIdleSeconds="300"
timeToLiveSeconds="0"
memoryStoreEvictionPolicy="LRU" />
</ehcache>
3、增加配置类
package hg.demo.spring.boot.web.ehcache;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
@Configuration
@EnableCaching
public class EhCacheConfig {
@Bean
public EhCacheManagerFactoryBean cacheManagerFactoryBean(){
EhCacheManagerFactoryBean bean = new EhCacheManagerFactoryBean();
bean.setConfigLocation(new ClassPathResource("ehcache.xml"));
bean.setShared(true);
return bean;
}
@Bean
public EhCacheCacheManager ehCacheCacheManager(EhCacheManagerFactoryBean bean){
return new EhCacheCacheManager(bean.getObject());
}
}
4、封装工具类
package hg.demo.spring.boot.web.ehcache;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.stereotype.Component;
/**
* @author hgSuper
* @date 2021-10-14
*/
@Slf4j
@Component("ehCacheUtils")
public class EhCacheUtils {
@Autowired
EhCacheCacheManager ehCacheCacheManager;
/**
* 设值
* @param cacheName 策略名
* @param key
* @param val json
*/
public void set(String cacheName, String key, String val) {
log.info("set(),ehcache-设值,cacheName:{}", cacheName);
log.info("set(),ehcache-设值,key:{}", key);
log.info("set(),ehcache-设值,val:{}", val);
ehCacheCacheManager.getCache(cacheName).put(key, val);
}
/**
* 查询
* @param cacheName
* @param key
* @return
*/
public String get(String cacheName, String key) {
log.info("get(),ehcache-查询,cacheName:{}", cacheName);
log.info("get(),ehcache-查询,key:{}", key);
String val = ehCacheCacheManager.getCache(cacheName).get(key, String.class);
log.info("get(),ehcache-查询,val:{}", val);
return val;
}
/**
* 删除
* @param cacheName
* @param key
*/
public void remove(String cacheName, String key) {
log.info("remove(),ehcache-删除,cacheName:{}", cacheName);
log.info("remove(),ehcache-删除,key:{}", key);
ehCacheCacheManager.getCache(cacheName).evict(key);
}
/**
* 清空
* @param cacheName
*/
public void clear(String cacheName) {
log.info("remove(),ehcache-清空,cacheName:{}", cacheName);
ehCacheCacheManager.getCache(cacheName).clear();
}
}
5、注解方式
1)@Cacheable
作用:在查询时,会先从缓存中获取,若不存在才再发起对数据库的访问。
@Cacheable(value="策略名,配置在ehcache.xml",key="'key_'+#id")
说明1: key,不支持枚举,支持静态常量
说明2: #id,即入参变量名,类型可以是对象,调用 【"#id" -> "#bean.name"】
2)@CacheEvict
作用:通常用在删除方法,用来从缓存中移除相应数据
@CacheEvict(value = "策略名,配置在ehcache.xml", key = "")
3)@CachePut
作用:用于数据新增和修改操作上,用于更新缓存。
@CachePut(value = "策略名,配置在ehcache.xml", key = "")