CategoryController,用户端查询分类id及其分类下对应的菜品,假如是第一次查询,那么就从数据库中查询并加入redis缓存中,若不是第一次查询,那么直接从redis中查询,不再查询数据库。
java
// redis缓存菜品,减少数据库的查询
// 在数据库中查找属于IO,假如有很多用户同时访问,那么查找效率将会变低,所以说要将菜品数据缓存在redis中,这样才方便调用
// 构造redis的逻辑:key就是分类的id,value是当前id下对应的菜品
@RestController("userDishController")
@RequestMapping("/user/dish")
@Slf4j
@Api(tags = "客户端-菜品浏览接口")
public class DIshController {
@Autowired
private DishService dishService;
// 自动注入redis操作工具
@Autowired
private RedisTemplate redisTemplate;
/**
* 根据菜品分类id查询对于的菜品及其口味
*
* @param categoryId
* @return
*/
@GetMapping("/list")
@ApiOperation("根据菜品分类查询对应菜品")
public Result<List<DishVO>> list(Long categoryId) {
// 构造redis中使用的key,规则:dish_分类id代表不同的菜品分类
String key = "dish_" + categoryId;
// 查询redis中是否查找当前key对应的菜品数据,将菜品数据封装为list集合返回
List<DishVO> valueList = (List<DishVO>) redisTemplate.opsForValue().get(key);
if (valueList != null && !valueList.isEmpty()) {
// 若存在这个值,那么直接返回,无需查询数据库
return Result.success(valueList);
}
// 若redis中不存在,那么查询数据库,并将其缓存在redis中
Dish dish = new Dish();
dish.setCategoryId(categoryId);
// 查询在售状态中的菜品
dish.setStatus(StatusConstant.ENABLE);
List<DishVO> list = dishService.listWithFlavor(dish);
// 将其缓存在redis中
redisTemplate.opsForValue().set(key, list);
return Result.success(list);
}
// 为了保持数据库中的数据和redis中缓存的数据保持一致,修改管理端的DishController的相关方法,每当数据发生变化,在管理端就要清除其缓存
}