点评P37作业

2024-06-23 10:41:26 浏览数 (1)

作业分析:

代码语言:javascript复制
@Override
    public Result queryTypeList() {
        //1.查询redis缓存
        List<String> shopTypeListInRedis = stringRedisTemplate.opsForList().range(SHOP_TYPE_KEY, 0, -1);

        //2.判断是否存在
        if(!shopTypeListInRedis.isEmpty()){
            //3.存在就返回
            List<ShopType> shopTypeList = shopTypeListInRedis.stream().map(item -> {
                return JSONUtil.toBean(item, ShopType.class);
            }).collect(Collectors.toList());

            return Result.ok(shopTypeList);
        }

        //4.不存在,查询数据库
        List<ShopType> shopTypeList = query().orderByAsc("sort").list();
        List<String> resList = shopTypeList.stream().map(item -> {
            return JSONUtil.toJsonStr(item);
        }).collect(Collectors.toList());

        //5.将查询出来写入redis
        stringRedisTemplate.opsForList().rightPushAll(SHOP_TYPE_KEY, resList);

        //6.将查询出的结果返回
        return Result.ok(shopTypeList);
    }

这段代码是一个Spring Boot应用中的服务层方法,主要功能是查询店铺类型的列表,并利用Redis作为缓存来提高查询效率。下面是对这段代码的分析及其实现方式和作用的详细说明:

  1. 引入依赖​
    • @Autowired​ 注解用于自动装配 StringRedisTemplate​,这是一个Spring Data Redis提供的模板类,用于操作Redis数据库中的字符串类型数据。
  2. 方法注释
    • 方法前的注释简要描述了此方法的目的:为查询店铺类型业务添加缓存机制。
  3. 查询Redis缓存
    • 使用 stringRedisTemplate.opsForList().range(SHOP_TYPE_KEY, 0, -1);​ 从Redis中根据键 SHOP_TYPE_KEY​ 获取一个列表类型的缓存数据。0, -1​ 表示获取全部元素。
  4. 判断缓存是否存在
    • 检查从Redis获取到的列表是否为空,如果不为空,则表示有缓存数据。
  5. 解析并返回缓存数据
    • 如果缓存存在,使用Java 8的Stream API遍历缓存中的每个字符串项,通过 JSONUtil.toBean(item, ShopType.class);​ 将JSON字符串转换为 ShopType​ 对象,最后收集这些对象到一个新的列表中并返回。
  6. 缓存未命中时查询数据库
    • 如果Redis中没有缓存数据,执行SQL查询(这里虽然没有直接展示SQL,但通过 query().orderByAsc("sort").list();​ 可知,是按照'sort'字段升序排序后获取所有ShopType​记录)。
  7. 将查询结果序列化并存入Redis
    • 将从数据库查询到的数据列表通过 JSONUtil.toJsonStr(item)​ 转换为JSON字符串,然后使用 stringRedisTemplate.opsForList().rightPushAll(SHOP_TYPE_KEY, resList);​ 将这些JSON字符串批量右推入Redis的列表中,作为新的缓存数据。
  8. 返回查询结果
  • 最终,无论数据来源于缓存还是数据库查询,都会返回查询到的 ShopType​ 列表给调用者。

总结

这段代码实现了查询店铺类型列表的功能,并通过Redis缓存机制来减少对数据库的访问,提高了系统的响应速度和效率。当有请求时,优先尝试从Redis中读取数据,如果缓存中没有,则查询数据库并将结果存入Redis以备后续使用,这是一种典型的缓存策略——“先缓存,后数据库”。

代码分析:

代码语言:javascript复制
List<ShopType> shopTypeList = shopTypeListInRedis.stream().map(item -> {
                return JSONUtil.toBean(item, ShopType.class);
            }).collect(Collectors.toList());

这段代码是Java 8 Stream API的一个典型应用,用于将从Redis获取的包含JSON字符串的列表转换为ShopType​对象的列表。下面是逐步拆解和分析:

  1. Stream流的创建
  • shopTypeListInRedis.stream()​:首先,对从Redis获取的字符串列表 shopTypeListInRedis​ 调用 stream()​ 方法,将其转换为一个Stream流。Stream是Java 8引入的新特性,用于处理集合等数据源的元素序列。
  1. 映射操作(map)
  • .map(item -> { return JSONUtil.toBean(item, ShopType.class); })​:这是Stream流的核心转换步骤。对于流中的每一个元素(在这里是每一个JSON字符串 item​),都会执行Lambda表达式定义的操作。Lambda表达式 item -> JSONUtil.toBean(item, ShopType.class)​ 的作用是将每个 item​(即JSON字符串)转换为一个 ShopType​ 对象。JSONUtil.toBean()​ 方法负责将JSON字符串反序列化为指定类型的Java对象,在这里是 ShopType.class​。
  1. 收集操作(collect)
  • .collect(Collectors.toList())​:最后,使用 collect()​ 方法对经过映射操作后的流进行收集,收集器 Collectors.toList()​ 会把所有的流元素收集到一个新的 List​ 中。这一步骤将转换后的 ShopType​ 对象们聚集起来,形成了最终需要的 List<ShopType>​。

整体作用

整体而言,这段代码完成了以下任务:

  • 将一个包含JSON字符串的列表 shopTypeListInRedis​ 通过Stream API处理,
  • 对每个JSON字符串调用 JSONUtil.toBean()​ 方法进行反序列化,将其转换为 ShopType​ 对象,
  • 最后,将所有转换后的 ShopType​ 对象收集到一个新的 List<ShopType>​ 中,即 shopTypeList​。

这种做法不仅代码简洁,而且充分利用了Java 8的函数式编程特性,提高了代码的可读性和效率。

0 人点赞