因为本人,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博客