缓存逻辑分析
- 目的:减轻数据库压力
- 每个分类下的菜品保存一份缓存数据
- 数据库中菜品数据有变更时清理缓存数据
key value dish_1 string(...) dish_2 string(...) dish_3 string(...)
@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);//查询起售中的菜品
//如果不存在,查询数据库并放入redis中
list = dishService.listWithFlavor(dish);
redisTemplate.opsForValue().set(key,list);
return Result.success(list);
}
存储成功
当前问题:如果价格等数据更新,缓存没用被清理,显示不变
清理缓存
当菜品状态或添加删除菜品,需要清理缓存
//将所有菜品缓存数据清理掉,所有以dish_开头的key
Set keys= redisTemplate.keys("dish_*");
redisTemplate.delete(keys);
//清理缓存数据
String key="dish_"+dishDTO.getCategoryId();
redisTemplate.delete(key);