苍穹外卖 Redis 手动缓存

苍穹外卖 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);  
    }  
}