一、Spring Cache介绍
Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单的加一个注解,就能实现缓存功能。
提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager接口统一不同的缓存技术。
CacheManager是Spring提供的各种缓存技术抽象接口。
针对不同的缓存技术需要实现不同的CacheManager:
二、spring cache注解
@CacheConfig 类级别的缓存注解,允许共享缓存名称
@Caching 将多种缓存操作分组
@Cacheable 触发缓存入口
@CacahePut 更新缓存
@CacheEvict 触发移除缓存
最常用的为最后三个:@Cacheable、@CacheEvict、@CacheEvict
三、实现步骤
在springboot项目中,使用缓存技术只需要在项目中导入相关缓存技术的依赖包,并在启动类上使用@EnableCaching开启缓存支持即可。
例如,使用redis作为缓存技术,只需要导入spring data redis 的maven坐标即可。
缓存套餐数据
1,实现思路
前面我们已经实现了移动端套餐查看功能,对应的服务端方法为SetmealController的list方法,此方法会根据前端提交的查询条件进行数据库查询操作。在高并发的情况下,频繁查询数据库会导致系统性能下降,服务端响应时间增长。现在需要对此方法进行缓存优化,提高系统的性能。
具体的实现思路如下:
2,导入spring cache和redis相关的maven坐标
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency>
3,在application.yml中配置缓存数据的过期时间
cache: redis: time-to-live: 1800000 #设置缓存数据的过期时间 30分钟
4,在启动类上加入@EnableCaching注解,开启缓存注解功能
/** * @author tigerhhzz * @date 2023/3/11 19:37 */ @Slf4j @SpringBootApplication @ServletComponentScan @EnableTransactionManagement(proxyTargetClass = true) @EnableCaching //开启缓存注解功能 public class tigerhhzzwaimaiappliction { public static void main(String[] args) { SpringApplication.run(tigerhhzzwaimaiappliction.class,args); log.info("tiger的项目启动成功。"); } }
5,在方法上加注解@Cacheable注解
在setmealcontroller的list方法上加入@Cacheable注解
/** *查询套餐列表 * @param setmeal * @return */ @GetMapping("/list") @Cacheable(value = "setmealCache",key = "#setmeal.categoryId + '_' + #setmeal.status") public R<List<Setmeal>> list(Setmeal setmeal) { log.info("setmeal:{}", setmeal); //条件构造器 LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.like(StringUtils.isNotEmpty(setmeal.getName()), Setmeal::getName, setmeal.getName()); queryWrapper.eq(null != setmeal.getCategoryId(), Setmeal::getCategoryId, setmeal.getCategoryId()); queryWrapper.eq(null != setmeal.getStatus(), Setmeal::getStatus, setmeal.getStatus()); queryWrapper.orderByDesc(Setmeal::getUpdateTime); return R.success(setmealService.list(queryWrapper)); }
在setmealcontroller的sava和delete方法上加入CacheEvict注解
/** * 新增套餐 * @param setmealDto * @return */ @PostMapping @CacheEvict(value = "setmealCache",allEntries = true) public R<String> save(@RequestBody SetmealDto setmealDto){ log.info("套餐信息:{}",setmealDto); setmealService.saveWithDish(setmealDto); return R.success("新增套餐成功"); }
/** * 删除套餐 * * @param ids * @return */ @DeleteMapping @CacheEvict(value = "setmealCache",allEntries = true) public R<String> delete(@RequestParam List<Long> ids){ log.info("ids:{}",ids); setmealService.removeWithDish(ids); return R.success("套餐数据删除成功"); }