缓存数据减轻服务器压力
问题:不是所有的数据都需要请求后端的
- 不是所有的数据都需要请求后端的,有些数据是
重复的、可以复用的
解决方案:缓存
实现思路:每一个分类为一个key,一个可以下面可以有很多菜品
- 前端是按照分类查询的,所以我们需要通过分类来缓存
缓存代码
/**
* 根据分类id查询菜品
*
* @param categoryId
* @return
*/
@GetMapping("/list")
@ApiOperation("根据分类id查询菜品")
public Result<List<DishVO>> list(Long categoryId) {
// 查询redis缓存
String key = "dish_" + categoryId;
// 如果缓存中有数据,直接返回
List<DishVO> list= (List<DishVO>) redisTemplate.opsForValue().get(key);
if(ObjectUtil.isNotEmpty(list)){
return Result.success(list);
}
// 如果缓存中没有数据,查询数据库,然后将数据存入缓存
Dish dish = new Dish();
dish.setCategoryId(categoryId);
dish.setStatus(StatusConstant.ENABLE);//查询起售中的菜品
list = dishService.listWithFlavor(dish);
redisTemplate.opsForValue().set(key, list);
return Result.success(list);
}
清除缓存
当数据发生变化的时候,需要将历史缓存清除掉,
防止不一致
package com.sky.controller.admin;
import java.util.List;
import java.util.Set;
@RestController
@RequestMapping("/admin/dish")
@Api(tags = "菜品相关接口")
@Slf4j
public class DishController {
private DishService dishService;
private RedisTemplate redisTemplate;
@Autowired
public DishController(DishService dishService, RedisTemplate redisTemplate) {
this.dishService = dishService;
this.redisTemplate = redisTemplate;
}
/**
* 新增菜品
*/
@PostMapping
@ApiOperation("新增菜品")
public Result<String> save(@RequestBody DishDTO dishDTO){
log.info("新增菜品:{}", dishDTO);
dishService.saveWithFlavor(dishDTO);
// 清理缓存
String key = "dish_" + dishDTO.getCategoryId();
cleanCache(key);
return Result.success();
}
/**
* 删除菜品
*/
@DeleteMapping
@ApiOperation("删除菜品")
public Result<String> delete(@RequestParam List<Long> ids){
log.info("删除菜品:{}", ids);
dishService.deleteBatch(ids);
// 清理所有的缓存
cleanCache("dish_*");
return Result.success();
}
/**
* 更新菜品
* @param dishDTO 菜品信息
*/
@PutMapping
@ApiOperation("更新菜品")
public Result update(@RequestBody DishDTO dishDTO) {
log.info("更新菜品:{}", dishDTO);
dishService.updateWithFlavor(dishDTO);
// 清理缓存
cleanCache("dish_*");
return Result.success();
}
@PostMapping("/status/{status}")
@ApiOperation("更新菜品状态")
public Result startOrStop( @PathVariable Integer status,Long id){
log.info("更新菜品状态:{}", id);
dishService.startOrStop(status,id);
// 清理缓存
cleanCache("dish_*");
return Result.success();
}
/**
* 清理缓存
*/
private void cleanCache(String pattern){
Set<String> keys = redisTemplate.keys(pattern);
redisTemplate.delete(keys);
}
}