大众点评项目 商品目录 添加Redis缓存

  • 需求:基于Redis查询商品信息
  • 业务实现
  • 给商品添加缓存
  • 给店铺类型添加缓存
  • 总结和业务流程

SpringCloud章节复习已经过去,新的章节Redis开始了,这个章节中将会回顾Redis实战项目 大众点评
主要依照以下几个原则

  1. 基础+实战的Demo和Coding上传到我的代码仓库
  2. 在原有基础上加入一些设计模式,stream+lamdba等新的糖
  3. 通过DeBug调试,进入组件源码去分析底层运行的规则和设计模式

代码会同步在我的gitee中去,觉得不错的同学记得一键三连求关注,感谢:
Redis优化-链接: RedisProject

需求:基于Redis查询商品信息

为了降低后端负载,提升读写效率和响应时间
我们可以通过缓存存取一些数据信息:存储在db的商品信息,或者前端展示的静态资源

下单缓存redis redis缓存商品_java


下单缓存redis redis缓存商品_下单缓存redis_02

业务实现

给商品添加缓存

以往的操作是调用了MP自带的API直接db查询

/**
     * 根据id查询商铺信息
     * @param id 商铺id
     * @return 商铺详情数据
     */
    @GetMapping("/{id}")
    public Result queryShopById(@PathVariable("id") Long id) {
        return Result.ok(shopService.getById(id));

我们进入Service层去修改业务,

  1. 通过@Resource 注入Bean private StringRedisTemplate stringRedisTemplate;
  2. 选取合适的类型存放k-V,这里我选择的是String
  3. 通过JSONUtil.toBean将我们存入Redis的JSON数据转换成相应的Shop.class格式
  4. 如果查不到,就去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层去修改业务,

  1. 通过@Resource 注入Bean private StringRedisTemplate stringRedisTemplate;
  2. 选取合适的类型存放k-V,这里我选择的是String
  3. 通过JSONUtil.toBean将我们存入Redis的JSON数据转换成相应的Shop.class格式,这里是List类型
  4. 如果查不到,就去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);
    }
}

总结和业务流程

下单缓存redis redis缓存商品_redis_03


下单缓存redis redis缓存商品_java_04


下单缓存redis redis缓存商品_java_05


下单缓存redis redis缓存商品_Redis_06