Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能,大大简化了业务代码的开发。
Spring Cache 提供了一层抽象,底层可以切换不同的缓存实现,例如:
-
EHCache
-
Caffeine
-
Redis(常用)
起步依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
常用注解
在SpringCache中提供了很多缓存操作的注解,常见的是以下的几个:
注解 | 说明 |
---|---|
@EnableCaching | 开启缓存注解功能,通常加在启动类上 |
@Cacheable | 在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中 |
@CachePut | 将方法的返回值放到缓存中 |
@CacheEvict | 将一条或多条数据从缓存中删除 |
在这里提一下@Cacheable和@CachePut的区别,前者是可以查缓存,可以将返回值放到缓存里,后者只是将返回值放到缓存里
缓存的使用:在spring boot项目中,使用缓存技术只需在项目中导入相关缓存技术的依赖包,并在启动类上使用@EnableCaching开启缓存支持即可。
例如,使用Redis作为缓存技术,只需要导入Spring data Redis的maven坐标即可。
下面介绍一下这几个注解的使用:
@EnableCaching
如果是springboot项目,通常加在启动类上,表示启用缓存的注解。例如:
@SpringBootApplication
@EnableCaching //开启注解缓存功能
public class SkyApplication {
public static void main(String[] args) {
SpringApplication.run(SkyApplication.class, args);
}
}
@Cacheable
@Cacheable是一个标注与类与方法上的注解,用于表示此类或此方法需要使用缓存机制。在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中
具体使用如下:
@GetMapping("/list")
@Cacheable(cacheNames = "setmealCache" ,key = "#categoryId")
//真正存到缓存里的key=setmealCache::categoryId
public Result<List<Setmeal>> list(Long categoryId){
log.info("根据分类id查询套餐,分类id为:{}",categoryId);
List<Setmeal> list = setmealService.getByCategoryId(categoryId);
return Result.success(list);
}
@CachePut
将方法返回值存入到缓存中,一般情况下是用在更新操作中,比如修改了数据库中的数据,缓存也需要更新。
/**
* 在更新数据库中的数据的同时,也更新缓存中的数据
*/
@CachePut(cacheNames = "emp", key = "#result.id")
public Employee updateEmp(Employee employee) {
System.out.println("进入更新数据库的操作!!"+employee);
employeeMapper.updateEmp(employee);
return employee;
}
@CacheEvict
清除缓存值,一般用在删除或更新操作中,并于Cacheable
与CachePut
配合使用。比如修改或删除了数据库中的值,缓存中的值也需要修改或删除掉。
使用方法如下:
@PostMapping //指定要删除的key
@CacheEvict(cacheNames = "setmealCache",key = "#setmealDTO.categoryId")
public Result save(@RequestBody SetmealDTO setmealDTO){
log.info("新增套餐:{}",setmealDTO);
setmealService.save(setmealDTO);
return Result.success();
}
@PutMapping //allEntries就是setmealCache下的全都删掉
@CacheEvict(cacheNames = "setmealCache",allEntries = true)
public Result modify(@RequestBody SetmealDTO setmealDTO){
log.info("修改套餐:{}",setmealDTO);
setmealService.modify(setmealDTO);
return Result.success();
}