文章目录
前言
在用户端中,每次点击左侧分类都会展示一遍菜品数据,而每次都是通过查询数据库获取的,效率低下,所以通过redis来缓存数据。
Spring Cache实现了基于注解的缓存功能,通过在方法上添加相应的注解,就能够实现相关缓存操作。
添加购物车时,涉及到多个表的操作,可以单独添加菜品,也可以添加套餐,添加菜品的时候有些也需要添加菜品口味信息。
一、缓存菜品
1. 问题说明
用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大,系统响应慢、用户体验差。
2. 解决办法
通过Redis来缓存菜品数据,减少数据库查询操作。
缓存逻辑分析
每个分类下的菜品保存一份缓存数据
数据库中菜品数据有变更时清理缓存数据
3. 代码开发
1、修改用户端接口 DishController 的 list 方法,加入缓存处理逻辑
@GetMapping("/list")
@ApiOperation("根据分类id查询菜品")
public Result<List<DishVO>> list(Long categoryId){
//构造redis中的key,规则:dish_分类id
String key = "dish_"+categoryId;
//查询redis中是否存在菜品数据
List<DishVO> list = (List<DishVO>) redisTemplate.opsForValue().get(key);
//如果存在,直接返回,无需查询数据库
if(list != null && list.size()>0){
return Result.success(list);
}
Dish dish = new Dish();
dish.setCategoryId(categoryId);
dish.setStatus(StatusConstant.ENABLE);//查询起售中的菜品
//如果不存在,查询数据库
list = dishService.listWithFlavor(dish);
//将查询到的数据放入redis中
redisTemplate.opsForValue().set(key,list);
return Result.success(list);
}
2、修改管理端接口 DishController 的相关方法,加入清理缓存的逻辑,当数据发生变更要及时清理redis中的缓存数据,不然会造成数据不一致
- 抽取清理缓存的方法
private void cleanCache(String pattern){
Set keys = redisTemplate.keys(pattern);
redisTemplate.delete(keys);
}
- 新增菜品
public Result save(@RequestBody DishDTO dishDTO){
log.info("新增菜品{}",dishDTO);
dishService.saveWithFlavor(dishDTO);
//清理缓存数据 新增菜品所属分类会受影响
String key = "dish_"+dishDTO.getCategoryId();
cleanCache(key);
return Result.success();
}
- 修改菜品
public Result update(@RequestBody DishDTO dishDTO){
log.info("修改菜品 {}",dishDTO);
dishService.updateWithFlavor(dishDTO);
//如果是修改菜品所属分类,就会影响两个分类 统一清理所有缓存数据
cleanCache("dish_*");
return Result.success();
}
- 批量删除菜品
public Result delete(