二八佳人体似酥,腰间仗剑斩愚夫。虽然不见人头落,暗里教君骨髓枯。
上一章简单介绍了SpringBoot整合Cache缓存技术(二十一),如果没有看过,请观看上一章
一.Ehcache
关于 Ehcache的详细用法,可以参考: EhCache
是进程内的缓存框架.
二. SpringBoot 整合 Ehcache 缓存
按照上一章节 Spring Cache 整合Redis 的用法, 整合 Ehcache.
按照 SpringBoot_Cache 项目 创建 SpringBoot_Ehcache 项目.
去掉关于 Redis的的相关信息,包括 依赖, config 配置和 RedisUtil 工具类。
二.一 添加 ehcache依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!--添加 ehcache依赖-->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
注意,要去掉 spring-boot-starter-data-redis 依赖信息.
二.二 配置 ehcache.xml 文件
在 resource 目录下, 创建 ehcache.xml 缓存配置文件
<ehcache>
<diskStore path="java.io.tmpdir/spring_ehcache"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="false"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
/>
<cache name="user_"
maxElementsInMemory="10000"
eternal="true"
overflowToDisk="true"
diskPersistent="true"
diskExpiryThreadIntervalSeconds="600"/>
</ehcache>
- name
: 缓存的名称,可以通过
指定名称获取指定的某个
Cache对象 -
maxElementsInMemory
:内存中允许存储的最大的元素个数
,0代表无限
个 -
clearOnFlush
:内存数量最大时是否清除
。 -
eternal
:设置缓存中对象是否为永久
的,如果是,超时设置将被忽略
,对象从不过期。根据存储数据的不同,例如一些静态不变的数据如省市区等可以设置为永不过时 -
timeToIdleSeconds
: 设置对象在失效前
的允许闲置
时间(单位:秒)。仅当eternal=false
对象不是
永久有效时使用
,可选属性,默认值是0,也就是可闲置时间无穷大
。 -
timeToLiveSeconds
:缓存数据的 生存时间
(TTL),也就是一个元素从构建到消亡的最大时间间隔值,这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。(和上面的两者取最小值
) -
overflowToDisk
:内存不足时,是否启用磁盘
缓存。 -
maxEntriesLocalDisk
:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。 -
maxElementsOnDisk
:硬盘最大缓存个数。 -
diskSpoolBufferSizeMB
:这个参数设置DiskStore(磁盘缓存
)的缓存区大小
。默认是30MB。每个Cache都应该有自己的一个缓冲区。 - diskPersistent
:是否在
VM重启时存储硬盘的缓存数据。默认值是
false。 -
diskExpiryThreadIntervalSeconds
:磁盘失效线程
运行时间间隔,默认是120秒。 -
memoryStoreEvictionPolicy
:当达到maxElementsInMemory
限制时,Ehcache将会根据指定的策略
去清理内存。默认策略是LRU(最近最少使用)
。你可以设置为FIFO(先进先出
)或是LFU(较少使用)
。这里比较遗憾,Ehcache并没有提供一个用户定制策略的接口,仅仅支持三种指定策略,感觉做的不够理想
二.三 application.yml 指定 ehcache缓存配置文件位置
server:
port: 8081
servlet:
context-path: /Ehcache
# 引入 数据库的相关配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true
username: root
password: abc123
# 去掉了以前大量的Redis配置
# 配置ehcache的使用
cache:
ehcache:
config: classpath:ehcache.xml # 配置ehcache文件的路径
#整合mybatis时使用的
mybatis:
#包别名
type-aliases-package: top.yueshushu.learn.pojo
#映射文件路径
mapper-locations: classpath:mybatis/mapper/**/*.xml
configuration:
#日志信息
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
二.四 启动类添加 @EnableCaching 缓存
@MapperScan("top.yueshushu.learn.mapper")
@SpringBootApplication
//开启缓存
@EnableCaching
public class RedisApplication {
public static void main(String[] args) {
SpringApplication.run(RedisApplication.class,args);
System.out.println("运行 Redis Cache的Ehcache缓存");
}
}
二.五 Spring Cache 注解与 Ehcache的使用
可以参考上一章节 Spring Cache 中注解的相关的用法信息.
这儿老蝴蝶不做太过的讲述.
二.五.一 @CacheConfig 类统一配置
@CacheConfig(cacheNames ={"user_"})
public class UserServiceImpl implements UserService {
}
二.五.二 @Cacheable 查询
@Override
@Cacheable(key="#id" )
public User findById(int id) {
return userMapper.findById(id);
}
@Override
@Cacheable(key = "#root.targetClass+#root.methodName")
public List<User> findAll() {
return userMapper.findAll();
}
@Cacheable(key = "#root.targetClass+#root.methodName")
@Override
public List<User> findByNameAndSex(String name, String sex) {
return userMapper.findByNameAndSex(name,sex);
}
二.五.三 @CachePut 修改
@CachePut(key = "#result.id")
@Override
public User addUser(User user) {
userMapper.addUser(user);
return user;
}
@Override
@CachePut(key = "#user.id")
public User updateUser(User user) {
userMapper.updateUser(user);
//更新全部的缓存信息
return user;
}
二.五.四 @CacheEvict 清空缓存
@Override
@CacheEvict(key = "#id")
public void deleteUser(int id) {
userMapper.deleteById(id);
}
二.五.五 @Caching 多缓存配置
@Caching(
cacheable = {
@Cacheable(key = "#name"), // 放置缓存到 name
@Cacheable(key="#sex") // 放置缓存到 sex , id的缓存用 put更新
},
put = {
@CachePut(key="#id") //同时更新 id缓存
}
)
@Override
public List<User> findByNameAndSexAndId(String name, String sex, Integer id) {
return userMapper.findByNameAndSexAndId(name,sex,id);
}
相应的测试,也是正常的。 Ehcache是放置在内存里面的,所以无法查询相应的内存信息.
本章节的代码放置在 github 上:
https://github.com/yuejianli/springboot/tree/develop/SpringBoot_Ehcache
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!