苍穹外卖 Redis 手动缓存
手动设置
@GetMapping("/list")
public Result<List<DishVO>> list(Long categoryId) {
// key:value===> dish_categoryId:string(List<DishVO>)
String key = "dish_" + categoryId;
// 查询 redis List<DishVO> list = (List<DishVO>) redisTemplate.opsForValue().get(key);
// 存在, 直接返回
if(list!=null&&!list.isEmpty()){
log.info("redis命中:{}",list);
return Result.success(list);
}
//不存在, 查询数据库, 放到redis,并返回
Dish dish = new Dish();
dish.setCategoryId(categoryId);
dish.setStatus(StatusConstant.ENABLE);//查询起售中的菜品
list = dishService.listWithFlavor(dish);
// 重新放redis
redisTemplate.opsForValue().set(key,list);
return Result.success(list);
}
数据一致性
业务分析: admin->DishController
- 新增菜品, 只需清理对应套餐的
cache即可 - 批量删除菜品, 清理所有套餐缓存.
- 修改菜品, 应清理当前菜品所属套餐缓存, 如果修改了菜品的套餐分类, 也要清理修改之后的套餐缓存, 因此直接全部清理.
public class DishController {
@Autowired
private DishService dishService;
@Autowired
private RedisTemplate redisTemplate;
@PostMapping
public Result save(@RequestBody DishDTO dishDTO) {
log.info("新增菜品:{}", dishDTO);
dishService.saveWithFlavors(dishDTO);
cleanCache("dish_"+dishDTO.getCategoryId());
return Result.success();
}
@GetMapping("/page")
public Result<PageResult> page(DishPageQueryDTO pageQueryDTO) {
log.info("菜品分页查询{}", pageQueryDTO);
PageResult pageResult = dishService.pageQuery(pageQueryDTO);
return Result.success(pageResult);
}
@DeleteMapping
public Result delete(@RequestParam List<Long> ids){
log.info("批量删除");
dishService.deleteBench(ids);
cleanCache("dish_*");
return Result.success();
}
@GetMapping("/{id}")
public Result<DishVO> getById(@PathVariable Long id){
log.info("根据id查询菜品{}",id);
DishVO dishVO = dishService.getByIdWithFlavors(id);
return Result.success(dishVO);
}
@PutMapping
public Result update(@RequestBody DishDTO dishDTO){
log.info("修改菜品:{}",dishDTO);
dishService.updateWithFlavors(dishDTO);
cleanCache("dish_*");
return Result.success();
}
private void cleanCache(String pattern){
Set keys = redisTemplate.keys(pattern);
redisTemplate.delete(keys);
}
}