概述
上一节我们讲了SpringBoot整合Redis缓存,这节我们来讲Ehcache。EhCache 是一个纯Java的轻量级进程内缓存框架,具有快速、简单等特点,是Hibernate中默认的缓存提供方。
相对于Redis这类可分布式的缓存中间件,Ehcache是属于进程内缓存,和Guava Cache、Caffeine等缓存框架一样都属于堆内存缓存,适合单点使用,不太适合分布式场景。
EhCache有哪些特点
- 快速,简单,并且提供多种缓存策略;
- 缓存数据有两级:内存和磁盘,无需担心容量问题;
- 缓存数据会在虚拟机重启的过程中写入磁盘;
- 可以通过RMI、可插入API等方式进行分布式缓存;
- 具有缓存和缓存管理器的侦听接口;
- 支持多缓存管理器实例,以及一个实例的多个缓存区域;
- 提供Hibernate的缓存实现;
开始在SpringBoot项目中使用Ehcache
※在上一节Redis的基础上,把redis相关的内容删除
- 在pom.xml中加入ecache依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
- 在资源根目录下创建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">
<!-- 操作系统缓存的临时目录,内存满后写入该目录 -->
<diskStore path="java.io.tmpdir"/>
<!-- 默认缓存
maxElementsInMemory:内存中最多可以存放的元素数量
overflowToDisk=true:将Cache中多出的元素放入磁盘文件中
overflowToDisk=false:根据memoryStoreEvictionPolicy策略替换Cache中原有的元素
eternal:缓存中对象是否永久有效
imeToIdleSeconds:当eternal=false时使用,缓存数据有效期(单位:秒),时间段内没有访问该元素,将被清除
timeToLiveSeconds:缓存数据的存活时间
maxElementsOnDisk:磁盘缓存中最多可以存放的元素数量
diskExpiryThreadIntervalSeconds:磁盘缓存的清理线程运行间隔
memoryStoreEvictionPolicy:缓存释放策略,LRU会优先清理最少使用的缓存
localTempSwap:持久化策略,当堆内存或者非堆内存里面的元素已经满了的时候,将其中的元素临时的存放在磁盘上,重启后就会消失
-->
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="3600"
timeToLiveSeconds="3600"
maxElementsOnDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LFU">
<persistence strategy="localTempSwap"/>
</defaultCache>
<cache name="users"
maxEntriesLocalHeap="200"
timeToLiveSeconds="600">
</cache>
</ehcache>
- 在yml文件中,加入ehcache配置信息
# Spring配置
spring:
cache:
ehcache:
config: classpath:ehcache.xml
-
在启动类上加入@EnableCaching开启缓存
-
Service层,和上节一样,代码如下:
package com.zhlab.demo.service;
import com.zhlab.demo.dao.SysAdminUserRepository;
import com.zhlab.demo.model.SysAdminUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
/**
* @ClassName SysAdminUserService
* @Description //SysAdminUserService
* @Author singleZhang
* @Email 405780096@qq.com
* @Date 2020/10/31 0031 上午 9:45
**/
@CacheConfig(cacheNames = "users")
@Service
public class SysAdminUserService {
@Autowired
SysAdminUserRepository sysAdminUserRepository;
@Cacheable(key="'user_'+#userId")
public SysAdminUser findUser(Long userId){
return sysAdminUserRepository.findById(userId).orElse(null);
}
@CachePut(key="'user_'+#result.adminUserId")
public SysAdminUser save(SysAdminUser user){
return sysAdminUserRepository.save(user);
}
@CacheEvict(key="'user_'+#userId")
public void deleteUser(Long userId) {
sysAdminUserRepository.findById(userId).ifPresent(sysAdminUserRepository::delete);
}
}
- 在接口层,我们来测试一下缓存是否实现了,注释部分就是需要测试的位置
package com.zhlab.demo.controller;
import com.zhlab.demo.model.SysAdminUser;
import com.zhlab.demo.service.SysAdminUserService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.CacheManager;
import org.springframework.web.bind.annotation.*;
/**
* @ClassName UserController
* @Description //用户接口层
* @Author singleZhang
* @Email 405780096@qq.com
* @Date 2020/10/31 0031 上午 9:43
**/
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
SysAdminUserService sysAdminUserService;
@Autowired
private CacheManager cacheManager;
@ApiOperation(value = "方法名:用户信息", notes = "获取用户信息")
@GetMapping("/{userId}")
public SysAdminUser findUser(@PathVariable Long userId){
// 查看一下CacheManager是否已经是EhCacheCacheManager
System.out.println("CacheManager type : " + cacheManager.getClass());
// 查询用户信息的时候,有无sql检索
SysAdminUser userInfo =sysAdminUserService.findUser(userId);
return userInfo;
}
}
- 启动项目,打开http://localhost:8080/swagger-ui.html
接口调试
第一次执行后,查看控制台输出的信息:
- CacheManager已经是EhCacheCacheManager
-
有sql查询信息
第一次查询结果
继续查询一次或者多查几次,后边几次都没有出现sql查询信息,返回的结果来自缓存
继续查询接口
返回结果
总结
EhCache的使用也是比较简单的,使用也比较广泛,通过上边的例子和之前的Redis操作,大家应该已经熟悉了缓存操作这个环节,以后在项目中应用起来应该是得心应手了。
网友评论