SpringCache
一、SpringCache介绍
1.Spring Cache是一个框架,实现基于注解的缓存功能。
2.Spring Cache提供了一层抽象,底层可以切换不同的cache实现,具体的就是通过CacheManager接口
来统一不同的缓存技术。
3.CacheManager是Spring提供的各种缓存技术抽象接口。
针对不同的缓存技术需要实现不同的CacheManager
EhCacheCacheManager --> 使用EhCache作为缓存技术
GuavaCacheManager --> 使用Google的GuavaCache作为缓存技术
RedisCacheManager --> 使用Redis作为缓存技术
二、SpringCache常用注解
1、@EnableCaching ---> 开启缓存注解功能, 在启动类上使用
2、@Cacheable ---> 查询缓存,在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接
返回缓存数据,如果没有数据,调用方法并将方法返回值放到缓存中。
3、@CachePut ---> 添加缓存, 将方法的返回值放到缓存中。
4、@CacheEvict --> 删除缓存, 将一条或多条或一类数据从缓存中删除。
3、@CachePut —> 添加缓存
/**
* @CachePut:
* 作用:把方法的返回值放到缓存中去
* 属性:
* cacheNames | value : 一种分类的名称
* key : 具体的每一条缓存数据的唯一标识
* #result : 得到方法的返回值[比较常用]
* #root.methodName : 得到方法的目标对象
* #root.target : 得到调用这个方法的目标对象
* #root.args[0] | #a0 | #p0 : 得到第一个参数[比较常用]
* 当没有导入依赖的时候,会默认把数据保存到内存中的一个Map集合中去
*/
@CachePut(cacheNames = "user", key = "#result.username")
@RequestMapping("/add")
public User add(User user){
System.out.println("user = " + user);
return user;
}
2、@Cacheable —> 查询缓存
/**
* @Cacheable:
* 作用:
* 1. 先查询缓存里面有没有数据,有就直接返回[不执行方法体]
* 2. 如果没有缓存,就会执行方法体,得到方法的结果,然后把结果存储到缓存中去
* 属性:
* cacheName | value : 存储这类数据的唯一标识
* key : 存储这类数据里面的这条数据的唯一标识
* #result : 得到方法的返回值【常用】
* #root.methodName : 得到方法的名称
* #root.target : 得到调用这个方法的目标对象
* #root.args[0] | #p0 | #a0 : 得到第一个参数【常用】
*/
@Cacheable(cacheNames = "user", key = "#a0")
@RequestMapping("/findById")
public User findById(int id){
System.out.println("执行findById..."+id);
if (id == 1){
return new User("zhangsan","1234556");
}else if (id == 2){
return new User("lisi","1234556");
}
return new User("王五","1234556");
}
/**
* 关于null值, 不缓存处理
* 1. 默认的情况下,@Cacheable不管是什么返回值,只要方法正常执行,得到的结果都缓存起来
* 2. 不希望把null缓存起来,没有意义
* 属性:
* condition : 满足她的条件,就缓存
* 如:condition = "#result != null"
* unless : 不满足她的条件,就缓存
* 如:unless = "#result == null"
*/
@Cacheable(cacheNames = "user" , key = "#a0" , unless = "#result == null")
@RequestMapping("/findById02")
public User findById02(int id){
System.out.println("执行了findById方法~!~!~!");
// 真实的代码应该是要去调用service
//User user = userService.findById(id);
//return user;
//伪代码
if(id == 1){
return new User("zhangsan", "123456");
}else if(id == 2){
return new User("lisi", "666666");
}
return null;
}
3、@CacheEvict --> 删除缓存
/**
* @CacheEvict
* 作用: 删除缓存里面的一条、多条、一类数据
* 属性:
* cacheName | value : 缓存里面的存储这一类数据的唯一标识
* key : 存储这类数据中一条数据的唯一标识
* #result : 得到方法的返回值[常用]
* #root.methodName : 得到方法名称
* #root.target : 得到调用这个方法的目标对象
* #root.args[0] | #p0 | #a0 : 得到第一个参数【常用】
* 删除一个:
* @CacheEvict(cacheNames="user", key="#a0")
* 删除一个:
* @CacheEvict(evict={
* @CacheEvict(cacheNames = "user", key="#a0"),
* @CacheEvict(cacheNames = "user", key="#a1"),
* @CacheEvict(cacheNames = "user", key="#a2"),
* @CacheEvict(cacheNames = "user", key="#a3"),
* @CacheEvict(cacheNames = "user", key="#a4"),
* })
* 删除一类
* @CacheEvict(cacheNames = "user", allEntries=true)
*/
@CacheEvict(cacheNames = "user", allEntries = true)
@RequestMapping("/deleteById")
public String deleteById(){
System.out.println("deleteById");
return "delete success... ";
}
三、SpringCache使用方法
1、导入maven坐标
spring-boot-starter-data-redis
spring-boot-starter-cache
2、配置application.yml
spring:
cache:
redis:
# 设置缓存有效期
time-to-live: 1800000000000
# 设置redis的地址
host: redis的地址
port: 6379
database: 2
3、在启动类上加上@EnableCacheing注解
4、在Controller方法上加入@Cacheable、@CacherEvict等注解,进行缓存操作。