关于(苍穹外卖)Cache问题的一点困惑与思路

因为本人,em---昨天看的,今天早上就有点迷惑了,在这里记录一下,并捋一下思路,

首先要明确的一点就是,我们是在uesr端进行缓存的,并且,菜品缓存是中的key是

String key = "dish_"+categoryId;

是根据菜品的分类id,作为key值的!!!这点先明确一下,不要搞混了,它可不是用菜品的id作为key值的,

@PostMapping
    @ApiOperation("新增菜品")
    public Result save(@RequestBody DishDTO dishDTO){
        log.info("新增菜品{}",dishDTO);
        dishService.saveAndFlavor(dishDTO);
//        清除数据缓存
        String key = "dish_"+dishDTO.getCategoryId();
        clearCache(key);
        return Result.success();
    }

注意:这里面这个清除缓存是那个分类新增了,就清除那个分类的缓存就行了,无需清除全部所有分类的缓存

  @DeleteMapping
    @ApiOperation("菜品批量删除")
    public Result Delete(@RequestParam List<Long> ids){//这样可以让spring自动将它分成{1,2,3}的形式
        log.info("菜品批量删除{}",ids);
        dishService.deleteBatch(ids);
//        删除缓存,直接删除全部缓存.删除全部以dish_开头的key
        clearCache("dish_*");
        return Result.success();
    }

批量删除为什么要删除全部缓存呢?是因为你批量删除,有可能在你删除的选项里面有属于A类的菜品,也可能有B类的菜品...就是她有可能会涉及多个分类,所以我们这边直接删除全部分类的缓存,简单省事

 @PutMapping
    @ApiOperation("修改菜品")
    public Result update(@RequestBody DishDTO dishDTO){
        log.info("修改菜品{}",dishDTO);
        dishService.updateWithFlavor(dishDTO);
        //        删除缓存,直接删除全部缓存.删除全部以dish_开头的key
        clearCache("dish_*");
        return Result.success();
    }

修改菜品为什么也要删除全部缓存呢?直接那个修改了就删除那个分类的缓存不就行了吗?不是这样的你看我们的修改页面,他是可以修改菜品所属分类的,举个例子,假如鸡蛋汤原本属于汤类,然后你修改成了东方糕类,这样就涉及到了多个分类的缓存,所以简单起见我们直接删除全部的分类的缓存,

/**
     * 菜品的起售停售
     * @param status
     * @param id
     * @return
     */
    @PostMapping("/status/{status}")
    @ApiOperation("菜品的起售或停售")
    public Result startOrStop(@PathVariable Integer status,Long id){
        log.info("菜品的起售或停售{},{}",status,id);
        dishService.startOrStop(status,id);
        clearCache("dish_*");
        return Result.success();
    }

菜品的这个起售和和停售,是今天早上让我很迷惑的一个问题,就是为什么,这个也要清除全部内存呢?我只是改了一个分类中某一个菜品的售卖状态,又没有涉及更改到多个分类,为什么还要删除全部分类的缓存呢?(ps:我是在套餐起售和停售哪里疑惑的,看到这里的小伙伴应该懂得我说的什么,两者一样,我就直接使用套餐那个来讲了)

/**
     * 套餐的停售或起售
     * @return
     */
    @PostMapping("/status/{status}")
    @ApiOperation("套餐的停售或起售")
//    @CacheEvict(cacheNames = "setmealCache",key = "#id")
    @CacheEvict(cacheNames = "setmealCache",allEntries = true)
    public Result startOrStop(@PathVariable Integer status,Long id){
        log.info("套餐的停售或起售");
        setmealService.startOrStop(status,id);
        return Result.success();
    }

我当时疑惑为什么不在方法上添加

 @CacheEvict(cacheNames = "setmealCache",key = "#id")

这个注释,直接修改这个id所对应的套餐分类不就行了么?一直很困惑,然后就上网查了查,发现一位大佬写的文章(放文章末尾了,感兴趣的同学可以去看一看,给大佬点赞),然后回头又看了一下代码

原来是:开头所强调的,菜品(套餐)所存储的key指的是所属分类的id,而不是菜品(套餐)的id,但是你看这里菜品(套餐)的起售停售这里他这个id指的是某一个菜品他自己的id而不是所属分类的id!!我把两者搞混了!

然后,话说回来,他毕竟只是改了一个分类的某个菜品(套餐),又不涉及多个,为什么要删除全部的缓存呢?

因为它参数里面传的是菜品的id,而不是其所属分类的id,所以你没办法把它的分类id找出来传进去,,所以你可以简单地选择删除所有分类的缓存,简单除暴,当然你也可以根据菜品的id把对应的菜品数据查询出来,菜品里面就有分类的id,之后动态的把key构造出来 然后清理某一个key就可以了。但是这样写需要额外的去数据库查询数据 就有的得不偿失了。毕竟使用缓存的目的就是缓解数据库的压力,你这再去为了缓存而去查询数据库,不是倒反天罡了吗

o.o 对了还有位大佬的博客也是关于这个问题的,xdm可以去看看这个哥好像把老师讲的都注释上了

苍穹外卖-day07:缓存菜品(业务逻辑),缓存套餐(Spring Cache),添加购物车(业务逻辑、冗余字段、动态sql属性字段位置),查看购物车,删除购物车中一个商品_如果你的后台数据中某个菜品只剩2个了,但是此时大量的订单进来了怎么办?-CSDN博客

  • 20
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值