大众点评项目 商品目录 添加Redis缓存
- 需求:基于Redis查询商品信息
- 业务实现
- 给商品添加缓存
- 给店铺类型添加缓存
- 总结和业务流程
SpringCloud章节复习已经过去,新的章节Redis开始了,这个章节中将会回顾Redis实战项目 大众点评
主要依照以下几个原则
- 基础+实战的Demo和Coding上传到我的代码仓库
- 在原有基础上加入一些设计模式,stream+lamdba等新的糖
- 通过DeBug调试,进入组件源码去分析底层运行的规则和设计模式
代码会同步在我的gitee中去,觉得不错的同学记得一键三连求关注,感谢:
Redis优化-链接: RedisProject
需求:基于Redis查询商品信息
为了降低后端负载,提升读写效率和响应时间
我们可以通过缓存存取一些数据信息:存储在db的商品信息,或者前端展示的静态资源
业务实现
给商品添加缓存
以往的操作是调用了MP自带的API直接db查询
/**
* 根据id查询商铺信息
* @param id 商铺id
* @return 商铺详情数据
*/
@GetMapping("/{id}")
public Result queryShopById(@PathVariable("id") Long id) {
return Result.ok(shopService.getById(id));
我们进入Service层去修改业务,
- 通过@Resource 注入Bean
private StringRedisTemplate stringRedisTemplate;
- 选取合适的类型存放k-V,这里我选择的是String
- 通过
JSONUtil.toBean
将我们存入Redis的JSON数据转换成相应的Shop.class
格式 - 如果查不到,就去DB查,这里就是对应的业务逻辑
@Resource
private StringRedisTemplate stringRedisTemplate;
@Override
public Result queryById(Long id) {
String key = RedisConstants.CACHE_SHOP_KEY + id;
String shopStr = stringRedisTemplate.opsForValue().get(key);
if(StrUtil.isNotBlank(shopStr)){
Shop shop = JSONUtil.toBean(shopStr, Shop.class);
return Result.ok(shop);
}
Shop shop = getById(id);
if (shop == null) {
return Result.fail("店铺类型不存在!");
}
stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(shop), RedisConstants.CACHE_NULL_TTL, TimeUnit.HOURS);
return Result.ok(shop);
}
给店铺类型添加缓存
我们进入Service层去修改业务,
- 通过@Resource 注入Bean
private StringRedisTemplate stringRedisTemplate;
- 选取合适的类型存放k-V,这里我选择的是String
- 通过
JSONUtil.toBean
将我们存入Redis的JSON数据转换成相应的Shop.class
格式,这里是List类型 - 如果查不到,就去DB查,这里就是对应的业务逻辑
@Resource
private StringRedisTemplate stringRedisTemplate;
@Override
public Result queryTypeList() {
String key = SHOP_TYPE_KEY;
List<ShopType> shopTypeList = JSONUtil.toList(stringRedisTemplate.opsForValue().get(key),ShopType.class);;
log.debug("typeList: " + shopTypeList.toString());
if(shopTypeList.size()==0){
shopTypeList = query().orderByAsc("sort").list();
log.debug("typeList: " + shopTypeList.toString());
if(shopTypeList==null) {
return Result.fail("没有相关信息");
}
stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(shopTypeList), CACHE_NULL_TTL, TimeUnit.HOURS);
return Result.ok(shopTypeList);
}
return Result.ok(shopTypeList);
}
}
总结和业务流程