昨晚在抖音刷小说绝了,都快通宵了,没早起
完成
- 商品浏览功能
- 缓存菜品
- 缓存套餐
- 添加购物车
- 查看购物车
- 清空购物车
收获
缓存菜品(redis)
在后期,如果大量用户进行访问,这时服务器的压力过大,造成卡顿,所以我们构造一个缓存区,在用户查询时先查询缓存区,如果没有再查询数据库同时将查询数据保存在缓存区,减少用户直接对数据库的访问,这里我们使用的是redis缓存
缓存思路:
- 每个分类下的菜品保存一份缓存数据, 将分类id作为Key-->对应的value为一个字符串(相当于Java中的List集合)
- 当数据库中的菜品数据有变更要及时清理缓存数据,这样保证redis和数据库中数据的一致性
构造缓存并查询
public Result<List<DishVO>> list(Long categoryId) {
//构造redis中的Key,规则:dish_分类id
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);
}
清理缓存,新增菜品进行精确清理,删除、更新操作是,将redis中以dish_开头的所有缓存清理
//清理缓存数据
String key = "dish_"+dishDTO.getCategoryId();
redisTemplate.delete(key);
缓存套餐(Spring Cache)
Spring Cache:基于注解的缓存功能,底层可以切换不同的缓存实现,例如:EHCache/Caffeine/Redis
在配置文件中导入依赖
spring cache的相关注解
@Cacheable(cacheNames = "myCache", key = "#param")
public Object myMethod(String param) {
// 方法体
}
- cacheNames:指定缓存名称,对应于配置中的缓存管理器中的缓存名。
- key:指定缓存的键,可以通过SpEL表达式指定,例如
#param
表示使用方法的参数作为键。
@CachePut注解:用于将方法的返回值存入缓存中,无论缓存中是否已存在该键,都会将返回值存入缓存。该注解常用于更新操作。
问题与解决
在idea中通过debug运行时,直接报错,拦截器没有加载
我最后检查出来时在注册拦截器前,没有将JwtTokenUserIntercepto进行注入
@Autowired
private JwtTokenUserInterceptor jwtTokenUserInterceptor;
第一个list报错401
这个可能是拦截器有问题,查看路径是否正确