当前位置: 首页 > news >正文

使用Redis管道进行查询接口性能优化

一、引入

        在我们的正常项目开发过程中,我们会通过Redis缓存数据,来帮我们进行异步任务,分担外部的请求压力

        但是Redis缓存也有一定的限制,因为我们在向请求过来时,Redis客户端都要向服务端发送一次请求,相应的Redis就必须执行一次命令并返回数据给客户端

        在这之中,每一次请求都会走一次网络,都会产生一次网络IO,同样的也就会造成一定程度上的延迟,在低并发时,影响并不大,但是在高并发情况下,就会对Redis的服务端产生巨大的压力。

二、管道

             对于管道介绍大家可以看这篇文章 介绍的很详细了  

                Redis精通系列——Pipeline(管道)

三、实战

            在v1版本中的列车搜索中  使用循环的方式 去获取Redis中缓存  每次的网络请求极大的消耗性能

// 单独获取列车价格信息
List<String> trainStationPriceKeys = seatResults.stream().map(each -> String.format(cacheRedisPrefix + TRAIN_STATION_PRICE, each.getTrainId(), each.getDeparture(), each.getArrival())).toList();
List<Object> trainStationPriceObjs = stringRedisTemplate.opsForValue().multiGet(trainStationPriceKeys);// 单独获取列车余票信息
List<String> trainStationRemainingKeyList = new ArrayList<>();
for (Object each : trainStationPriceObjs) {List<TrainStationPriceDO> trainStationPriceList = JSON.parseArray(each.toString(), TrainStationPriceDO.class);// ...for (TrainStationPriceDO item : trainStationPriceList) {String trainStationRemainingKey = cacheRedisPrefix + TRAIN_STATION_REMAINING_TICKET + StrUtil.join("_", item.getTrainId(), item.getDeparture(), item.getArrival());trainStationRemainingKeyList.add(trainStationRemainingKey);}
}// 单独获取列车余票信息
List<Object> TrainStationRemainingObjs = new ArrayList<>();
for (int i = 0; i < trainStationRemainingKeyList.size(); i++) {TrainStationPriceDO trainStationPriceDO = trainStationPriceDOList.get(i);Object obj = stringRedisTemplate.opsForHash().get(trainStationRemainingKeyList.get(i), trainStationPriceDO.getSeatType().toString());TrainStationRemainingObjs.add(obj);
}

            v2版本中stringRedisTemplate.executePipelined 方法用于创建Redis管道,在管道中执行一系列Redis操作,例如gethGet操作。这些操作会一次性发送到Redis服务器,并在一次网络通信中获取多个结果,从而提高了效率。

// 创建管道
List<Object> trainStationPriceObjs = stringRedisTemplate.executePipelined((RedisCallback<String>) connection -> {trainStationPriceKeys.forEach(each -> connection.stringCommands().get(each.getBytes()));return null;
});// 其他逻辑...// 创建管道
List<Object> TrainStationRemainingObjs = stringRedisTemplate.executePipelined((RedisCallback<String>) connection -> {for (int i = 0; i < trainStationRemainingKeyList.size(); i++) {connection.hashCommands().hGet(trainStationRemainingKeyList.get(i).getBytes(), trainStationPriceDOList.get(i).getSeatType().toString().getBytes());}return null;
});

相关文章:

使用Redis管道进行查询接口性能优化

一、引入 在我们的正常项目开发过程中&#xff0c;我们会通过Redis缓存数据&#xff0c;来帮我们进行异步任务&#xff0c;分担外部的请求压力 但是Redis缓存也有一定的限制&#xff0c;因为我们在向请求过来时&#xff0c;Redis客户端都要向服务端发送一次请求&#xff0c;相应…...

初学vue.js

准备Vue.js环境 ① 下载环境&#xff1a; javaScript语言的程序包&#xff1a;外部js文件 对于Vue来说&#xff0c;导入Vue的外部js文件就能够使用Vue框架了。 Vue框架的js文件获取: 官网提供的下载地址&#xff1a;https://cdn.jsdelivr.net/npm/vue/dist/vue.js ②导入环境…...

React的thunk中间件

Thunk 是一种中间件&#xff0c;它可以在 Redux 中处理异步操作。Thunk 中间件允许你在 action 中返回一个函数&#xff0c;而不仅仅是一个普通的 action 对象。这个返回的函数可以接收 dispatch 和 getState 作为参数&#xff0c;并且可以在函数内部进行异步操作。当使用 Thun…...

数组初学者向导:使用Python从零开始制作经典战舰游戏

引言 战舰游戏&#xff0c;一个广受欢迎的经典游戏&#xff0c;为玩家提供了策略与猜测的完美结合。这个游戏的核心思想是通过猜测敌方船只的位置并尝试击沉它们来赢得比赛。在这篇文章中&#xff0c;我们将使用Python语言和数组来构建这款游戏&#xff0c;让你更加了解数组的…...

【STM32】IAP升级 预备知识

IAP&#xff08;In Application Programming&#xff09;简介 Flash够大的情况下&#xff0c;上电后的程序通过修改 MSP 的方式&#xff0c;可以在一块Flash上存在多个功能差异的程序。 IAP是为了在执行正常功能前&#xff0c;为了升级功能&#xff0c;提前运行的一段程序。这…...

asp.net网站的建立及运行

点击创建新项目 在输入框中输入asp.net&#xff0c;并选择图中的 点击下一步 点击创建 然后&#xff0c;右键&#xff0c;添加&#xff0c;新建项 选择web窗体 点击添加 点击视图&#xff0c;工具箱 选择一个label&#xff0c;记住这个id 空白处右键&#xff0c;查看代码 添…...

怎么把webm转换成mp4?

怎么把webm转换成mp4&#xff1f;与MP4这位视频格式大哥相比&#xff0c;Webm这种视频格式还有很多小伙伴对它不太熟悉&#xff0c;因为大家平时也是偶尔才能接触到&#xff0c;属于不常用的视频格式。Webm是一种开放、免费的媒体文件格式&#xff0c;尽管如今它的应用范围比以…...

RabbitMQ 消息应答

每日一句 物是人非事事休,欲语泪先流。 概述 为了保证消息在发送过程中不丢失,RabbitMQ引入了消息应答机制, 消费者在接收到消息并且处理该消息后,告诉RabbitMQ它已经处理了,RabbitMQ可以把消息删除了。 自动应答 消息发送后立即被认为已经传送成功,这种模式需要在…...

【C++】C++ 类中的 this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )

文章目录 一、全局函数 与 成员函数 相互转化1、成员函数转为全局函数 - 多了一个参数2、全局函数转为成员函数 - 通过 this 指针隐藏操作数 二、有参构造函数设置默认参数值三、返回匿名对象与返回引用四、完整代码示例 一、全局函数 与 成员函数 相互转化 1、成员函数转为全局…...

游戏遇到的问题

天涯明月刀 就是天刀的假全屏&#xff0c;很多天刀玩家可能玩其他游戏比较少或者对电脑了解不多&#xff0c;不在意帧数&#xff0c;但是肯定还是有一部分玩家发现了这个问题&#xff0c;就是“我使命召唤12都能跑到60帧的机器跑个破天刀40帧甚至30帧?”问题何在呢&#xff1…...

高性能系统的性能优化技巧:从专家的经验中学习 | 开源日报 No.40

binhnguyennus/awesome-scalability Stars: 48.3k License: MIT 这个项目是一个阅读列表&#xff0c;用于说明可扩展、可靠和高性能大规模系统的模式。该项目通过知名工程师的文章和可信参考资料来解释概念&#xff0c;并从为数以百万计甚至十亿用户提供服务的经过实战验证的系…...

Linux系统编程——进程间通信的学习

学习参考博文&#xff1a; 进程间的五种通信方式介绍Linux 信号介绍 Linux系统编程学习相关博文 Linux系统编程——文件编程的学习Linux系统编程——进程的学习Linux系统编程——线程的学习Linux系统编程——网络编程的学习 Linux系统编程——进程间通信的学习 一、概述1. 无…...

人工智能AI 全栈体系(六)

第一章 神经网络是如何实现的 这些年神经网络的发展越来越复杂&#xff0c;应用领域越来越广&#xff0c;性能也越来越好&#xff0c;但是训练方法还是依靠 BP 算法。也有一些对 BP 算法的改进算法&#xff0c;但是大体思路基本是一样的&#xff0c;只是对 BP 算法个别地方的一…...

NPDP是什么?考了有用吗?

1&#xff09;NPDP是什么&#xff1f; NPDP&#xff0c;全称为New Product Development Professional&#xff0c;即新产品开发专业人员。NPDP认证是由世界产品开发协会&#xff08;PDMA&#xff09;推出的一项专业认证。它旨在评估和认可个人在新产品开发领域的专业知识和技能…...

关于安卓SVGA浅尝(二)加载数据

关于安卓SVGA浅尝&#xff08;二&#xff09;加载数据 相关链接 SVGA官网 SVGA-github说明文档 背景 项目开发&#xff0c;都会和动画打交道&#xff0c;动画的方案选取&#xff0c;就有很多选择。如Json动画&#xff0c;svga动画&#xff0c;gif等等。各有各的优势。目前项…...

使用matlab产生二维动态曲线视频文件具体举例

使用matlab产生二维动态曲线视频文件举例 在进行有些函数变化过程时候&#xff0c;需要用到直观的动态显示&#xff0c;本博文将举例说明利用Matlab编程进行二维动态曲线的生成视频文件。 一、问题描述 利用matlab编程实现 y 1 s i n ( t ) , y 2 c o s ( t ) , y 3 s i …...

Selenium自动化测试框架常见异常分析及解决方法

01 pycharm中导入selenium报错 现象: pycharm中输入from selenium import webdriver, selenium标红 原因1: pycharm使用的虚拟环境中没有安装selenium, 解决方法: 在pycharm中通过设置或terminal面板重新安装selenium 原因2: 当前项目下有selenium.py,和系统包名冲突导致, …...

[TI] [Textual Inversion] An image is worth an word

自己的理解&#xff1a; 根据几个图像&#xff0c;找出来一个关键字可以代表它们&#xff0c;然后我们可以再用这个关键字去生成新的东西。 提出关键字 1 Introduction word->token->embedding Textual Inversion过程 需要&#xff1a; ① a fixed, pre-trained text…...

remote: The project you were looking for could not be found

git拉取公司项目时报错&#xff1a; remote: The project you were looking for could not be found 发生这个问题的原因&#xff0c;在于git账号可能并未真正登录。 我们可以通过打开电脑的凭据管理器&#xff0c;查看git当前的登录是否正常。 参考链接&#xff1a;参考...

https跳过SSL认证时是不是就是不加密的,相当于http?

https跳过SSL认证时是不是就是不加密的,相当于http?&#xff0c;其实不是&#xff0c;HTTPS跳过SSL认证并不相当于HTTP&#xff0c;也不意味着没有加密。请注意以下几点&#xff1a; HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;本质上是在HTTP的基础上…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略&#xff08;地理位置/文件&#xff09; 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型&#xff0c;核心实现方式&#xff1a; 标准消息类型&#xff1a;直接使用 SDK 内置类型&#xff08;文件、图片等&#xff09;自…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...