day22 缓存

1. 今天做了什么

外卖day7的一部分

  1. 缓存菜品
  2. 缓存套餐

2. 核心知识点

  1. 两种实现缓存的方式
    1. 使用Redis自己实现缓存
      1. 根据分类id查询菜品,将分类id作为key,将查询到的集合作为value
      2. 查询时先查缓存是否存在,存在直接返回,不存在则查询后存入缓存返回
      3. 一旦管理端发生新增,修改,删除,起售停售,都要对缓存进行清理
    2. 使用Spring Cache实现缓存
      1. 完全使用注解实现,很方便
      2. 在启动类使用注解进行开启
      3. 在相应查询接口上添加注解,实现查询时先查缓存是否存在,存在直接返回,不存在则查询后存入缓存返回
      4. 在管理端新增,修改,删除操作添加清除缓存的注解
      5. Spring Cache底层可以用多种方式实现,这里使用Redis,添加了Redis的依赖,可以自动识别

3. 深度思考

  1. 为什么要做缓存
    1. 在业务执行过程中,数据库查询操作从磁盘读取数据,比较耗时
    2. 用户使用量比较大时加载较慢,影响使用体验
    3. 在Redis中做缓存,从内存中读取速度很快

4. 踩过的坑

  1. redisTemplate.delete()不支持通配符,redisTemplate.keys()支持,先查询keys,再删除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@ApiOperation("修改菜品")  
@PutMapping
public Result update(@RequestBody DishDTO dishDTO){
log.info("修改菜品:{}", dishDTO);
dishService.update(dishDTO);

//更新菜品后,清除缓存
clearCache("dish_*");
return Result.success();
}


private void clearCache(String pattern){
Set keys = redisTemplate.keys(pattern);
redisTemplate.delete(keys);
}
  1. Spring Cache的@CacheEvict注解,清除所有setmealcache的缓存:
1
@CacheEvict(cacheNames = "setmealcache", allEntries = true)

5. 遗留问题 / 想不通