栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

瑞吉外卖项目学习笔记-P22-项目优化-缓存菜品数据

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

瑞吉外卖项目学习笔记-P22-项目优化-缓存菜品数据

P22-项目优化-缓存菜品数据
  • 1.实现思路
  • 2.代码改造
    • 2.1DishController--list方法改造
    • 2.2DishController--save方法改造
    • 2.3DishController--update方法改造

1.实现思路

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

具体的实现思路如下:

  1. 改造DishController的list方法 ,先从Redis中获取菜品数据,如果有则直接返回,无需查询数据库;如果没有则查询数据库,并将查询到的菜品数据放入Redis。
  2. 改造DishController的save和update方法, 加入清理缓存的逻辑

注意事项
在使用缓存过程中,要注意保证数据库中的数据和缓存中的数据一致,如果数据库中的数据发生变化,需要及时清理缓存数据。

2.代码改造 2.1DishController–list方法改造
 @GetMapping("/list")
 public R> list(Dish dish){
     ListdishDtoList=null;
     //项目优化-动态构造key
     String key="dish_"+dish.getCategoryId()+"_"+dish.getStatus();//dish_1371000_1
     //项目优化:先从redis中获取缓存数据
     dishDtoList = (List) redisTemplate.opsForValue().get(key);

     //项目优化:如果存在,直接返回,无需查询数据库
     if (dishDtoList!=null){
         return R.success(dishDtoList);
     }

     //项目优化:如果不存在,需要查询数据库,将查询到的菜品数据缓存到redis
     //构早查询条件
     LambdaQueryWrapperdishLambdaQueryWrapper=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 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 dishFlavorLambdaQueryWrapper=new LambdaQueryWrapper<>();
         dishFlavorLambdaQueryWrapper.eq(DishFlavor::getDishId,dishId);
         //菜品的口味
         List 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方法改造
    
    @PostMapping
    public R 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方法改造
    @PutMapping
    public R update(@RequestBody DishDto dishDto){
        log.info(dishDto.toString());
        dishService.updateWithFlavor(dishDto);
        //项目优化:清理某个分类下面的菜品缓存数据
        String key="dish_"+dishDto.getCategoryId()+"_1";
        redisTemplate.delete(key);
        return R.success("修改菜品成功");

    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/926623.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号