缓存菜品数据

发布时间 2023-04-06 14:33:39作者: 佛系粥米

实现思路:

  前面已经实现了移动端菜品查看功能,对应的服务端方法为DishController中的list方法,此方法会根据前端提交的查询条件进行数据库查询操作。在高并发的情况下,频繁查询数据库会导致系统性能下降,服务端响应时间增长。现在需要对此方法进行缓存优化,提高系统的性能

具体的实现思路:

  1、改造DishController的list方法,先从Redis中获取菜品数据,如果有则直接返回,无需查询数据库;如果没有则查询数据库,并将查询到的菜品数据放入Redis中

  2、改造DishController的save和update方法,加入清理缓存的逻辑

注意:在使用缓存时,要注意数据库中的数据和缓存中的数据一致,如果数据库中的数据发生变化,需要及时清理缓存数据

  

 @GetMapping("/list")
    public R<List<DishDto>> list(Dish dish){

        List<DishDto> dishDtos = null;

        //动态构造key
        String key = "dish_" + dish.getCategoryId() + "_" + dish.getStatus();
        //先从redis中获取缓存数据
        dishDtos = (List<DishDto>)redisTemplate.opsForValue().get(key);
        if(dishDtos!=null){
            //如果存在,直接返回,无需查询数据库
            return R.success(dishDtos);
        }

        //如果不存在,需要查询数据库,将查询到的菜品数据缓存到Redis
        Long categoryId = dish.getCategoryId();
        //构造条件查询
        LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(categoryId!=null, Dish::getCategoryId, categoryId);
        //添加排序条件
        queryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);
        //查询status=1启售的菜品
        queryWrapper.eq(Dish::getStatus, 1);
        List<Dish> dishes = dishService.list(queryWrapper);
        //将菜品和对应口味信息封装到dishDto
        dishDtos = dishes.stream().map((item) -> {
            DishDto dishDto = new DishDto();
            BeanUtils.copyProperties(item, dishDto);
            //根据菜品id查询对应的口味
            LambdaQueryWrapper<DishFlavor> lambdaQueryWrapper = new LambdaQueryWrapper<>();
            lambdaQueryWrapper.eq(DishFlavor::getDishId, item.getId());
            List<DishFlavor> flavors = dishFlavorService.list(lambdaQueryWrapper);
            dishDto.setFlavors(flavors);
            return dishDto;
        }).collect(Collectors.toList());
        //如果不存在,需要查询数据库,将查询到的菜品数据缓存到Redis
        redisTemplate.opsForValue().set(key, dishDtos, 60, TimeUnit.MINUTES);
        return R.success(dishDtos);
    }

 

 /**
     * 将菜品和菜品风味保存到对应的表里面(新增)
     * @return
     */
    @PostMapping
    public R<String> save(@RequestBody DishDto dishDto){
        dishService.saveWithFlavor(dishDto);
        //log.info(dishDto.toString());

        //清理所有菜品的缓存数据
        // Set keys = redisTemplate.keys("dish_*");
        //redisTemplate.delete(keys);

        //清理某个分类下面的菜品缓存数据
        String key = "dish_" + dishDto.getCategoryId() + "_1";
        redisTemplate.delete(key);
        return R.success("新增菜品成功");
    }
 /**
     * 修改菜品
     * @param dishDto
     * @return
     */
    @PutMapping
    public R<String> update(@RequestBody DishDto dishDto){
        dishService.updateWithFlavor(dishDto);

        //清理所有菜品的缓存数据
        // Set keys = redisTemplate.keys("dish_*");
        //redisTemplate.delete(keys);

        //清理某个分类下面的菜品缓存数据
        String key = "dish_" + dishDto.getCategoryId() + "_1";
        redisTemplate.delete(key);


        return R.success("修改成功");
    }