前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >点评P37作业

点评P37作业

作者头像
捞月亮的小北
发布2024-06-23 10:41:26
730
发布2024-06-23 10:41:26
举报
文章被收录于专栏:捞月亮的小北捞月亮的小北

作业分析:

代码语言: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的函数式编程特性,提高了代码的可读性和效率。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 作业分析:
  • 代码分析:
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档