P22-项目优化-缓存菜品数据
1.实现思路
前面已经实现了移动端菜品查看功能,对应的服务端方法为DishController的list方法,此方法会根据前端提交的查询条件进行数据库查询操作。
在高并发的情况下,频繁查询数据库会导致系统性能下降,服务端响应时间增长。现在需要对此方法进行缓存优化,提高系统的性能。
具体的实现思路如下:
- 改造DishController的list方法 ,先从Redis中获取菜品数据,如果有则直接返回,无需查询数据库;如果没有则查询数据库,并将查询到的菜品数据放入Redis。
- 改造DishController的save和update方法, 加入清理缓存的逻辑
注意事项
在使用缓存过程中,要注意保证数据库中的数据和缓存中的数据一致,如果数据库中的数据发生变化,需要及时清理缓存数据。
2.代码改造
2.1DishController–list方法改造
@GetMapping("/list")
public R<List<DishDto>> list(Dish dish){
List<DishDto>dishDtoList=null;
//项目优化-动态构造key
String key="dish_"+dish.getCategoryId()+"_"+dish.getStatus();//dish_1371000_1
//项目优化:先从redis中获取缓存数据
dishDtoList = (List<DishDto>) redisTemplate.opsForValue().get(key);
//项目优化:如果存在,直接返回,无需查询数据库
if (dishDtoList!=null){
return R.success(dishDtoList);
}
//项目优化:如果不存在,需要查询数据库,将查询到的菜品数据缓存到redis
//构早查询条件
LambdaQueryWrapper<Dish>dishLambdaQueryWrapper=new LambdaQueryWrapper<>();
dishLambdaQueryWrapper.eq(dish.getCategoryId()!=null,Dish::getCategoryId,dish.getCategoryId());
//添加排序条件
dishLambdaQueryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);
//添加查询调价,状态为1 在售的菜品
dishLambdaQueryWrapper.eq(Dish::getStatus,1);
//执行查询
List<Dish> list = dishService.list(dishLambdaQueryWrapper);
dishDtoList=list.stream().map((item)->{ //item 为dish 实体类对应的项
DishDto dishDto = new DishDto();
BeanUtils.copyProperties(item,dishDto);
Long categoryId = item.getCategoryId(); //分类categoryId在 dish实体类里面
//根据categoryId查询分类对象
Category category = categoryService.getById(categoryId);
if (category!=null){
String categoryName = category.getName();//分类名称在 category实体类里面
dishDto.setCategoryName(categoryName); //给实体类 dishDto的categoryName赋值
}
//当前菜品的id
Long dishId = item.getId();
LambdaQueryWrapper<DishFlavor> dishFlavorLambdaQueryWrapper=new LambdaQueryWrapper<>();
dishFlavorLambdaQueryWrapper.eq(DishFlavor::getDishId,dishId);
//菜品的口味
List<DishFlavor> dishFlavorList = dishFlavorService.list(dishFlavorLambdaQueryWrapper);
dishDto.setFlavors(dishFlavorList);
return dishDto;
}).collect(Collectors.toList());
//项目优化:如果不存在,需要查询数据库,将查询到的菜品数据缓存到redis
redisTemplate.opsForValue().set(key,dishDtoList,60, TimeUnit.MINUTES);
return R.success(dishDtoList);
}
2.2DishController–save方法改造
/**
* 新增菜品
* @param dishDto
* @return
*/
@PostMapping
public R<String> save(@RequestBody DishDto dishDto){
log.info(dishDto.toString());
dishService.saveWithFlavor(dishDto);
//项目优化:清理某个分类下面的菜品缓存数据
String key="dish_"+dishDto.getCategoryId()+"_1";
redisTemplate.delete(key);
return R.success("新增菜品成功");
}
2.3DishController–update方法改造
/**
* 修改菜品,点击保存操作
* @param dishDto
* @return
*/
@PutMapping
public R<String> update(@RequestBody DishDto dishDto){
log.info(dishDto.toString());
dishService.updateWithFlavor(dishDto);
//项目优化:清理某个分类下面的菜品缓存数据
String key="dish_"+dishDto.getCategoryId()+"_1";
redisTemplate.delete(key);
return R.success("修改菜品成功");
}