【黑马程序员】Redis 课程 P37 的练习_三种方式实现功能_【黑马点评项目】给店铺类型查询业务添加缓存

news2024/11/23 17:19:27

  • 本博客内容对应的视频为https://www.bilibili.com/video/av766995956/?p=37
  • 补充介绍【黑马点评项目】是黑马官方于 2022-02-28 BiliBili 发表的学习视频教程的练手项目

1.简介


练习:给店铺类型查询业务添加缓存

店铺类型在首页和其它多个页面都会用到,它的内容也不会经常发生改动,这种类型的数据适合存储在缓存中。

在这里插入图片描述


需求:修改 ShopTypeController 中的 queryTypeList 方法,添加查询缓存

相关 URL:http://localhost:8080/api/shop-type/listGET

  • src/main/java/com/hmdp/controller/ShopController.java

在这里插入图片描述


2.其他代码


  • src/main/java/com/hmdp/controller/ShopTypeController.java
@RestController
@RequestMapping("/shop-type")
public class ShopTypeController {
    @Resource
    private IShopTypeService typeService;

    @GetMapping("list")
    public Result queryTypeList() {
    	/* 原代码(没什么用了,注释掉) */
        /* List<ShopType> typeList = typeService
                .query().orderByAsc("sort").list();
        return Result.ok(typeList); */

        return typeService.queryShopTypeString();
        // return typeService.queryShopTypeList();
        // return typeService.queryShopTypeZSet();
    }
}

  • src/main/java/com/hmdp/service/IShopTypeService.java
public interface IShopTypeService extends IService<ShopType> {
    Result queryShopTypeString();
    
    Result queryShopTypeList();
    
    Result queryShopTypeZSet();
}

  • src/main/java/com/hmdp/utils/RedisConstants.java
public static final String CACHE_SHOP_TYPE_KEY = "cache:shopType";

这个 CACHE_SHOP_TYPE_KEY 的值是我为了便于在 Redis 中辨认和书写代码取的。


具体的业务操作在 Service 的实现类中实现

  • src/main/java/com/hmdp/service/impl/ShopTypeServiceImpl.java
@Service
public class ShopTypeServiceImpl extends ServiceImpl<ShopTypeMapper, ShopType> implements IShopTypeService {
    @Resource
    private StringRedisTemplate stringRedisTemplate;

	@Override
    public Result queryShopTypeString() { return null; }

	@Override
    public Result queryShopTypeList() { return null; }

	@Override
    public Result queryShopTypeZSet() { return null; }
}

3.业务代码


最终效果图和上面一样,我也就不贴效果图了。

下面的代码我都跑过一遍了,Redis 存入了数据,前端图片也可以正常显示。


3.1.缓存 String 类型的数据


  • src/main/java/com/hmdp/service/impl/ShopTypeServiceImpl.java
@Override
public Result queryShopTypeString() {
    String key = CACHE_SHOP_TYPE_KEY; // CACHE_SHOP_TYPE_KEY = "cache:shopType";

    // 1.从 Redis 中查询商铺缓存
    String shopTypeJson = stringRedisTemplate.opsForValue().get(CACHE_SHOP_TYPE_KEY);

    // 2.判断 Redis 中是否存在数据
    if (StrUtil.isNotBlank(shopTypeJson)) {
        // 2.1.存在,则返回
        List<ShopType> shopTypes = JSONUtil.toList(shopTypeJson, ShopType.class);
        return Result.ok(shopTypes);
    }
    // 2.2.Redis 中不存在,则从数据库中查询
    List<ShopType> shopTypes = query().orderByAsc("sort").list();

    // 3.判断数据库中是否存在
    if (shopTypes == null) {
        // 3.1.数据库中也不存在,则返回 false
        return Result.fail("分类不存在!");
    }
    // 3.3.2.1.数据库中存在,则将查询到的信息存入 Redis
    stringRedisTemplate.opsForValue().set(CACHE_SHOP_TYPE_KEY, JSONUtil.toJsonStr(shopTypes));
    // 3.3.2.2.返回
    return Result.ok(shopTypes);
}

在这里插入图片描述


3.2.缓存 List 类型的数据


  • src/main/java/com/hmdp/service/impl/ShopTypeServiceImpl.java
@Override
public Result queryShopTypeList() {
    String key = CACHE_SHOP_TYPE_KEY; // CACHE_SHOP_TYPE_KEY = "cache:shopType";

    // 1.从 Redis 中查询商铺缓存
    List<String> shopTypeJsonList = stringRedisTemplate.opsForList().range(CACHE_SHOP_TYPE_KEY, 0, -1);

    // 2.判断 Redis 中是否有该缓存
    if (shopTypeJsonList != null && !shopTypeJsonList.isEmpty()) {
        // 2.1.若 Redis 中存在该缓存,则直接返回
        ArrayList<ShopType> shopTypes = new ArrayList<>();
        for (String str : shopTypeJsonList) {
            shopTypes.add(JSONUtil.toBean(str, ShopType.class));
        }
        return Result.ok(shopTypes);
    }
    // 2.2.Redis 中若不存在该数据,则从数据库中查询
    List<ShopType> shopTypes = query().orderByAsc("sort").list();

    // 3.判断数据库中是否存在
    if (shopTypes == null || shopTypes.isEmpty()) {
        // 3.1.数据库中也不存在,则返回 false
        return Result.fail("分类不存在!");
    }

    // 3.3.2.1.数据库中存在,则将查询到的信息存入 Redis
    for (ShopType shopType : shopTypes) {
        stringRedisTemplate.opsForList().rightPushAll(CACHE_SHOP_TYPE_KEY, JSONUtil.toJsonStr(shopType));
    }

    // 3.3.2.2.返回
    return Result.ok(shopTypes);
}

在这里插入图片描述


3.3.缓存 ZSet 类型的数据


  • src/main/java/com/hmdp/service/impl/ShopTypeServiceImpl.java
@Override
public Result queryShopTypeZSet() {
    String key = CACHE_SHOP_TYPE_KEY; // CACHE_SHOP_TYPE_KEY = "cache:shopType";

    // 1.从 Redis 中查询商铺缓存
    Set<String> shopTypeJsonSet = stringRedisTemplate.opsForZSet().range(CACHE_SHOP_TYPE_KEY, 0, -1);

    // 2.判断 Redis 中是否有该缓存
    if (shopTypeJsonSet.size() != 0) {
        // 2.1.若 Redis 中存在该缓存,则直接返回
        List<ShopType> shopTypes = new ArrayList<>();
        for (String str : shopTypeJsonSet) {
            shopTypes.add(JSONUtil.toBean(str, ShopType.class));
        }
        return Result.ok(shopTypes);
    }

    // 2.2.若 Redis 中无该数据的缓存,则查询数据库
    List<ShopType> shopTypes = query().orderByAsc("sort").list();

    // 3.判断数据库中是否存在
    if (shopTypes == null || shopTypes.isEmpty()) {
        // 3.1.数据库中也不存在,则返回 false
        return Result.fail("分类不存在!");
    }

    // 3.3.2.1.数据库中存在,则将查询到的信息存入 Redis
    for (ShopType shopType : shopTypes) {
        stringRedisTemplate.opsForZSet().add(CACHE_SHOP_TYPE_KEY,JSONUtil.toJsonStr(shopType),shopType.getSort());
    }

    // 3.3.2.2.返回
    return Result.ok(shopTypes);
}

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/5056.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

栈和队列(顺序表、单链表形式)

栈和队列栈栈.顺序表结构体的设计栈的初始化栈的销毁入栈出栈获取栈顶数据判断栈空栈中有效元素的个数Stack.hStack.ctest.c栈.单链表结构体设计栈的初始化栈的销毁入栈出栈获取栈顶元素判断栈是否为空获取栈中元素个数Stack.hStack.ctest.c队列队列.顺序表结构体的设计队列的初…

学生HTML个人网页作业作品 简单的IT技术个人简历模板html下载 简单个人网页设计作业 静态HTML个人博客主页

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

Python老手也会犯的20个新手级错误

Python编码时应避免的常见错误 编程&#xff08;不仅Python&#xff0c;也包括其它编程语言&#xff09;最好的一点是&#xff0c;有多种方法来实现同一解决方案。 使用不同的方法来达到相同的结果&#xff08;图像由作者绘制&#xff09; 由于下述原因&#xff0c;有些方法会比…

几款很好看的爱心表白代码(动态)

分享几款好看的爱心表白代码❤️爱心代码❤️&#xff08;C语言&#xff09;❤️流动爱心❤️&#xff08;htmlcssjs&#xff09;❤️线条爱心❤️&#xff08;htmlcssjs&#xff09;❤️biu表白爱心❤️&#xff08;htmlcssjs&#xff09;❤️matlab爱心函数❤️&#xff08;需…

Java类和对象(一)

&#x1f380;作者&#xff1a;爱塔居的博客_CSDN博客-领域博主 &#x1f32d;专栏&#xff1a;JavaSE &#x1f367;作者简介&#xff1a;大三学生&#xff0c;想要努力地变得更好&#xff01; 附上一张可可爱爱的猫猫图~ &#x1f353;&#x1f353;&#x1f353;&#x1f35…

论文学习——多度量水文时间序列相似性分析

文章目录摘要1 研究背景1.1 主要研究内容1.2 研究背景1.3 启发2 基于改进BORDA投票法的多度量水文时间序列相似性分析2.1 研究方法2.2 BORDA投票法的改进2.2.1 BORDA 的缺点2.2.2 改进的BORDA投票法3 实验验证与分析3.1 实验数据3.2 实验结果分析4 结语多度量组合可以提高相似性…

关于使用GB28181协议实现与大华摄像机的语音对讲功能小记

目前只测试了与大华摄像机的语音对讲功能&#xff0c;在此记录下对接工程中遇到的问题和收获。 首先我们需要理清下思路&#xff1a; 第一步要熟悉语音对讲的协议流程&#xff0c;下图为国标28181中的参考图&#xff1a; 这里我们可以简化下流程&#xff0c;只参与与摄像机的…

计算机网络第二章知识点回顾(自顶向下)

第二章知识点回顾1.应用层1.1网络应用架构1.1.1客户-服务器架构1.1.2P2P架构1.1.3两种架构的对比1.2不同终端上的进程通信1.3进程与网络的接口&#xff1a;套接字1.4进程如何标识自己&#xff1a;进程编址1.5因特网提供的传输服务小结1.6Web应用画像1.7 HTTP协议1.7.1HTTP使用T…

大数据技术基础实验十三:Kafka实验——订阅推送示例

大数据技术基础实验十三&#xff1a;Kafka实验——订阅推送示例 文章目录大数据技术基础实验十三&#xff1a;Kafka实验——订阅推送示例一、前言二、实验目的三、实验要求四、实验原理1、Kafka简介2、Kafka使用场景五、实验步骤1、配置各服务器之间的免密登录2、安装ZooKeeper…

【C++】优先级队列 priority_queue的使用模拟实现 | 仿函数

&#x1f308;欢迎来到C专栏~~优先级队列的使用 & 模拟实现 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01…

聚乙二醇衍生物MAL-PEG-NH2,Maleimide-PEG-amine,CAS:1207751-12-9​

英文&#xff1a;MAL-PEG-NH2&#xff0c;Maleimide-PEG-amine 中文&#xff1a;马来酰亚胺-聚乙二醇-氨基 2、CAS编号&#xff1a;1207751-12-9 3、所属分类&#xff1a;Amine PEG Maleimide PEG 4、分子量&#xff1a;可定制&#xff0c;5000、2000、3400、20000、10000、…

【附源码】Python计算机毕业设计汽车租赁网站

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

eBPF学习笔记(一)—— eBPF介绍内核编译

eBPF学习笔记&#xff08;一&#xff09;—— eBPF介绍&内核编译eBPF介绍eBPF基础代码验证即时编译eBPF开发工具BCCbpftracelibbpf C/C库eBPF Go库内核编译查看内核版本下载内核源码安装依赖项安装最新版llvm和clang配置内核编译内核BPF示例程序常见问题问题一&#xff1a;…

C++ 堆、大顶堆、小顶堆、堆排序

目录一、什么是堆&#xff1f;1.1 大顶堆1.2 小顶堆1.3 自定义greater1.4 堆索引的特点1.5 堆操作添加元素删除最大元素检查序列是否是堆检查部分序列为堆对堆进行排序升序降序问题&#xff1a;sort()和sort_heap()有什么区别二、排序算法&#xff1a;堆排序2.1 堆排序原理创建…

Bootstrap框架(全)

Bootstrap中文网&#xff1a;点我直达 Bootstrap菜鸟教程&#xff1a;点我直达 目录&#xff1a;&#xff08;一&#xff09;Bootstrap标准模板&#xff1a;&#xff08;二&#xff09;CSS样式区&#xff1a;一、布局容器&#xff1a;二、栅格系统&#xff1a;1.列组合&#x…

<Linux> 软件包管理器yum及编辑器vim的使用

文章目录一、yum的背景知识1. 商业生态2. 开源生态3. 软件生态本土化二、yum 的基本使用1. 查看软件包2. 安装、卸载、搜索软件实现Windows下和Linux下文件互传三、vim的基本使用1. vim 的基本概念2. vim 的基本操作2.1.模式间切换2.2.插入模式2.3.命令模式2.4.底行模式四、vim…

nginx(四十二)access阶段的模块学习

一 ngx_http_access ① 基本描述 场景&#xff1a; 限制某些ip来源的访问;基于ip进行限制细节点&#xff1a; 基于$remote_addr进行判断的 ② allow deny ③ 官方案例 说明&#xff1a; 按照配置文件中allow|deny的先后顺序,只要匹配上则停止继续匹配 ④ 经典应用场…

Rust机器学习之ndarray

Rust机器学习之ndarray 众所周知&#xff0c;Python之所以能成为机器学习的首选语言&#xff0c;与其丰富易用的库有很大关系。某种程度上可以说是诸如numpy、pandas、scikit-learn、matplotlib、pytorch、networks…等一系列科学计算和机器学习库成就了Python今天编程语言霸主…

Vue项目实战——【基于 Vue3.x + NodeJS】实现的课程表排课系统二(week-title)

文章目录基于 Vue3.x NodeJS实现的课程表排课系统&#xff08;二&#xff09;初始化样式封装axios处理数据表格头部&#xff08;周几&#xff09;子组件写入根组件App.vue浅拿一下数据基于 Vue3.x NodeJS实现的课程表排课系统&#xff08;二&#xff09; 初始化样式 src/ass…

当 AI 遇上 web3,会碰撞出什么火花?

2020 年之前&#xff0c;Web3 的路是创造者们铺好的。但 Web3 遇上了金融&#xff0c;这出乎了每个创造者的意料之外&#xff0c;稳定币、AMM 和借贷突其来地点燃了2020年的那个夏天。之后 Web3 又遇到了 NFT、游戏和元宇宙。不过因为技术限制&#xff0c;除了金融之外&#xf…