通过Redis来缓存菜品数据,减少数据库查询操作
流程
修改用户端接口 DishController 的 list 方法,加入缓存处理逻辑
//构造redis中的key "dish_"+categoryId;
String key = "dish_"+categoryId;
//查询redis中是否存在菜品数据
List<DishVO> list = (List<DishVO>) redisTemplate.opsForValue().get(key);
if (list!=null&&list.size()>0){
//如果存在 直接返回 无需查询数据库
return Result.success(list);
}
Dish dish = new Dish();
dish.setCategoryId(categoryId);
dish.setStatus(StatusConstant.ENABLE);//查询起售中的菜品
//如果不存在 查询数据库 并且将查询到的放到redis中
list = dishService.listWithFlavor(dish);
redisTemplate.opsForValue().set(key,list);
return Result.success(list);
抽取清理缓存的方法
//清理缓存数据
private void cleanCache(String pattern){
Set keys = redisTemplate.keys(pattern);
redisTemplate.delete(keys);
}
调用清理缓存的方法,保证数据一致性
@Autowired
private RedisTemplate redisTemplate;
@PostMapping
public Result save(@RequestBody DishDTO dishDTO) {
dishService.saveWithFlavor(dishDTO);
//清理缓存数据
cleanCache("dish_"+dishDTO.getCategoryId());
return Result.success();
}
Spring Cache
1 定义
Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。
Spring Cache 提供了一层抽象,底层可以切换不同的缓存实现,例如:
EHCache
Caffeine
Redis
2 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
<version>2.7.3</version>
</dependency>
3 常用注解
示例
(1)在用户端接口SetmealController的 list 方法上加入@Cacheable注解
(2)在管理端接口SetmealController的 save、delete、update、startOrStop等方法上加入CacheEvict注解