Redis 管道(Pipeline)是什么?有什么用?

目录

1. redis 客户端-服务端模型的不足之处

2. redis 管道是什么?有什么好处?

3. 管道的使用场景

4. 管道使用的注意事项


1. redis 客户端-服务端模型的不足之处

众所周知,redis 是一个客户端-服务端的模型设计,客户端向服务端发送存储数据的请求共分为四步(发送命令——>命令排队——>命令执行——>返回结果),简单来说就是一问一答的交互方式,在等待返回结果的期间,通常是以阻塞的模式等待服务端响应。

举个例子,我使用 set 命令存放3个数据,实际上是与 redis 交互了三次。

127.0.0.1:6379> set user1 aaa
OK
127.0.0.1:6379> set user2 bbb
OK
127.0.0.1:6379> set user3 ccc
OK

首先:客户端发送 set user1 aaa 命令;

其次:该命令开始排队等待被执行;

然后:开始执行当前命令;

最后:客户端等待命令执行返回的结果;

这样做是有有个很大的缺点的,那就是频繁交互会比较耗费性能,每执行一条命令,就需要客户端和服务端进行一次交互,而且还会阻塞等待。一旦出现高并发的场景,每秒钟都会有上千上万次的数据请求,频繁调用系统的IO资源发送网络请求,会对系统资源造成浪费,redis 的性能就会因为频繁的交互而大打折扣。

也许有些朋友会说,我可以使用 mset 命令,一次完成上述散步存放操作,如下,使用 mset 命令就可以一次存放 user1,user2,user3 三条数据,降低了交互次数提高了效率。

但是,mset 命令只能用于 String 类型数据的存储,如果换成hset,就会报错,所以不难看出,mset 命令是有一定的局限性的。

127.0.0.1:6379> mset user1 aaa user2 bbb user3 ccc
OK
127.0.0.1:6379> mset user4 ddd hset k1 v1 k2 v2
(error) ERR wrong number of arguments for 'mset' command

所以,为了解决频繁数据交互导致 redis 性能下降,就有了管道(Pipeline)。

2. redis 管道是什么?有什么好处?

管道本身不难理解,像我们日常生活中遇到的水管,天然气管,都是用来传输特定的东西的。类比到 Redis 中,Redis管道就是用来批量传输命令的。

redis 管道的本质其实是一个队列,用一句话来说它可以批次处理多条命令;将两个,三个,甚至N个命令合成一个,一块打包交给 Redis 服务器,让 Redis 服务器一起执行这些命令。可以类似的理解为 Redis 原生批命令 "mset","mget" 。

管道的好处:

(1)将原本需要多步完成的数据交互操作一次完成,提高了数据的处理效率;

(2)显著减少了客户端与服务器之间的网络通信次数,尤其是对于需要执行大量命令的场景,能够极大的降低网络延迟带来的影响;

3. 管道的使用场景

Pipeline主要适用于需要对 Redis 执行大量命令的操作,例如数据批量导入,大规模数据更新,复杂查询等。这些耗时操作如果不使用管道将会使整体执行时间显著增加,降低了服务器的响应速度。

对于涉及事务(translaction)的操作,虽然也可以使用Pipeline来打包命令,但需要注意的是,Pipeline不提供事务的原子性和一致性。如果有明确需求要确保一组命令作为一个原子单位执行,建议使用 Redis 提供的MULTI/EXEC 命令来开启事务。

4. 管道使用的注意事项

(1)分批处理:虽然 Pipeline 能够显著提高命令的执行效率,但一次性发送的命令数量也不宜过大,否则可能会导致数据包过大进而对网络传输造成较大压力,但是,如果发送的请求量过于庞大,Redis 也是会分多批次发送的。举个例子,加入我现在有一个客户端连接,要发送30K条数据进行存储,Redis 无法将30K条数据一次性接收处理,这个时候就会将30K条数据分三次进行发送,每次发送10K,而 Redis 在处理过后,也会分三次进行返回告知数据已经处理完毕。

(2)响应顺序:Redis服务器会按接收到命令的顺序返回结果。即使在Pipeline中并发发送多个命令,客户端接收到的响应也将按照命令发送的顺序排列。

(3)使用方式:实际开发过程中,由于内存,网络等各种因素的影响,管道的使用方式也是灵活多变的。常见的有服务端攒批和客户端攒批两种方式。

服务端攒批,这种也可以直接借助于服务端提供的事务支持指令来完成。

客户端存储大量数据操作,批次发送给服务端,服务端会按照顺序在短时间内处理大量请求。

(4)故障处理:如果Pipeline中的某个命令执行失败(如语法错误、key不存在等),后续命令通常仍会继续执行。错误信息会包含在相应命令的响应中,客户端可以根据这些信息判断哪些命令执行成功,哪些失败。

(5)异步操作:Redis 管道中的所有命令是在服务器端按顺序执行的,但客户端与服务器之间的通信是批量进行的,客户端可以在发送完一批命令后立刻开始处理其他任务,无需等待每个命令的单独响应。这种异步处理方式可以更好地利用客户端的计算资源,提高整体应用程序的并发性能。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SALOME源码分析:View Model

作为一款开源的CAx(CAD/CAE/CAM)软件集成平台,为了实现各个Module支持不同的数据显示与交互方案,出于扩展性的考虑,SALOME引入了View Model,用以支持OpenGL、OCC、VTK、ParaView、Qwt等数据显示与交互实现。 本文将以OCCViewer、…

一文搞懂 java 线程池:ScheduledThreadPool 和 WorkStealingPool 原理

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…

PHP宜邦家政服务管理系统-计算机毕业设计源码04426

目 录 摘要 1 绪论 1.1 选题背景与意义 1.2开发现状 1.3论文结构与章节安排 2 宜邦家政服务管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 操作可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用…

力扣hot100 -- 动态规划(上)

目录 ❄技巧 🌼爬楼梯 🍔杨辉三角 🌊打家劫舍 🐎完全平方数 🌼零钱兑换 🌼单词拆分 ❄技巧 动态规划dp-CSDN博客 👆花 5 分钟快速刷一遍 花 10 分钟浏览一下 线性DP 背包DP&#x1f447…

VS展示6个错误中的0个解决方法

左键点击展示6个错误中的0个 左键点击展示23个警告中的0个

国产强大免费WAF, 社区版雷池动态防护介绍

雷池WAF,基于智能语义分析的下一代 Web 应用防火墙 使用情况 我司于2023年4月23日对雷池进行测试,测试一个月后,于2023年5月24日对雷池进行正式切换,此时版本为1.5.1。 里程碑纪念 后续一直跟随雷池进行版本升级,当前…

怎样使用js技术实现Chrome投屏功能?

在Web前端技术中,直接控制浏览器窗口或标签页从主屏投屏到副屏(如PPT的演讲者模式)并不简单,而且直接控制浏览器窗口从主屏投屏到副屏的功能超出了Web标准的范畴,并且涉及到用户系统级别的设置和权限,因此不…

ETCD概述--使用/特性/架构/原理

ETCD概述 ETCD是一个高度一致的分布式键值存储, 它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据(高可用, 强一致性)​全局的配置服务中心. 本文将介绍其特性、相关操作和常见的应用场景. 如果想了解更多, 请查阅我的技术博客: https://dingyuqi.com 特性 …

C语言分支和循环(下)

C语言分支和循环(下) 1. 随机数生成1.1 rand1.2 srand1.3 time1.4 设置随机数的范围 2. 猜数字游戏实现 掌握了前面学习的这些知识,我们就可以写⼀些稍微有趣的代码了,比如: 写⼀个猜数字游戏 游戏要求: 电…

git常用命令速查表

Git相关概念简述 版本库:git在本地开辟的一个存储空间,一般在 .git 文件里。工作区(workspace): 就是编辑器里面的代码,我们平常开发直接操作的就是工作区。暂存区(index/stage):暂时存放文件的…

13. Revit API: Filter(过滤器)

13. Revit API: Filter(过滤器) 前言 在讲Selection之前,还是有必要先了解一下的过滤器的。 对了,关于查找一些比较偏的功能或者API的用法,可以这样查找 关键词 site:https://thebuildingcoder.typepad.com/ site是…

C语言 -- 函数

C语言 -- 函数 1. 函数的概念2. 库函数2.1 标准库和头文件2.2 库函数的使用方法2.2.1 功能2.2.2 头文件包含2.2.3 实践2.2.4 库函数文档的一般格式 3. 自定义函数3.1 函数的语法形式3.2 函数的举例 4. 形参和实参4.1 实参4.2 形参4.3 实参和形参的关系 5. return 语句6. 数组做…

react ts 封装3D柱状图,支持渐变

留档,以防忘记 bar3D.tsx import React, { useEffect, useRef, useState } from react; import * as echarts from echarts; import echarts/lib/chart/bar; import echarts/lib/chart/pictorialBar; import echarts/lib/component/grid; import echarts/lib/comp…

Centos7 安装老版本的chrome

查看自己linux是哪个centos版本 使用以下命令: cat /etc/centos-release我这里是centOS 7。然后在安装最新版的google-chrome时,总是会报错显示存在依赖环境的问题,使得无法安装成功chrome。 Package: google-chrome-stable (/google-chro…

使用 Rustup 管理 Rust 版本

文章目录 安装 Rustup配置镜像源安装 Rustup 安装 RustVS Code插件创建项目代码示例 Rust 官网:https://www.rust-lang.org/zh-CN/Crates 包管理:https://crates.io/Rust 程序设计语言:https://kaisery.github.io/trpl-zh-cn/通过例子学 Rust…

如何对低代码平台进行分类?

现在市面上的低代码平台就像雨后春笋一样冒出来,而且源源不绝,但总结下来,大致的也就以下三类。 一、 aPaaS多引擎类(有很多成熟引擎、做好东西要一起用) 这类产品包括:织信Informat(国内&…

使用 Smart-doc 记录 Spring REST API

如果您正在使用 Spring Boot 开发 RESTful API,您希望让其他开发人员尽可能容易地理解和使用您的 API。文档是必不可少的,因为它为将来的更新提供了参考,并帮助其他开发人员与您的 API 集成。很长一段时间以来,记录 REST API 的方…

uni-app上传失败超出文件限制解决方法-分包处理-预加载

分包背景 当你的上传出现一下错误: Error: 系统错误,错误码:80051,source size 2089KB exceed max limit 2MB [20240703 10:53:06][wxbf93dfb6cb3eb8af] [1.06.2405010][win32-x64] 说明你主包太大需要处理了,一下两种方法可以…

REGX52.H报错

keil cannot open source input file "REGX52.H": No such file or directory 选择下面这个目录 Keil\C51\INC\Atmel

SpringCloudAlibaba基础四 微服务调用组件OpenFeign

JAVA 项目中如何实现接口调用? 1)Httpclient HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 Http 协议的客户端编程工具包,并且它支持 HTTP 协议最新版本和建议。HttpClient 相比传统 …