缓存菜品

当有多个用户使用小程序时,会发出大量请求,访问数据库,造成卡顿

image-20251124193854568

思路

image-20251207191558987

controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@GetMapping("/list")
@ApiOperation("根据分类id查询菜品")
public Result<List<DishVO>> list(Long categoryId) {

//构造redis中的key
String key = "dish_" + categoryId;
//逻辑:查询菜品,看redis是否有菜品的缓存
//因为返回的list就是DishVO类型,所以这里也是
List<DishVO> list1 = (List<DishVO>) redisTemplate.opsForValue().get(key);
if (list1 != null){
//如果有,读取缓存,无需查询数据库
return Result.success(list1);
}

Dish dish = new Dish();
dish.setCategoryId(categoryId);
dish.setStatus(StatusConstant.ENABLE);//查询起售中的菜品

//若没有,查询数据库,查询缓存
List<DishVO> list = dishService.listWithFlavor(dish);
redisTemplate.opsForValue().set(key,list);
return Result.success(list);

}

清理缓存数据

当修改套餐数据的时候,因为缓存没清理,导致返回的套餐界面也没更新

应该在admin的conctoller下的dishcontroller修改

但是如果对对应的方法来清理缓存,太过繁琐,索性直接把所有缓存删掉,让他重新生成

因为要调用的方法重复,所以定义一个私有函数

Spring Cache

image-20251208160420766

常用注释

image-20251208160612989

CachePut用法

@CachePut(cacheNames = “类名”,key = “spel” [allEntries = true] 这个是全部清除)

在redis生成key的方式为:类名::spel

例如:

@CachePut(cacheNames = “userCache”,key = “#user.id”)

public User save(@RequestBody User user){

}

这里的key就是:userCache::user.id,获取user的id

这么做是为了不让生成的key重复,避免缓存冲突