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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Zoom视颊会议软件使用

GPT-3.5 (OpenAI) Zoom是一款极受欢迎的视频会议软件。使用Zoom可以方便地进行视频会议、远程授课、在线研讨会等活动。以下是Zoom的使用步骤: 1. 下载Zoom客户端 可以在Zoom官网上下载对应平台的Zoom客户端。下载并完成安装后,双击打开客户端。 2. 创建…

大数据开发中如何计算用户留存及SQL示例

在大数据开发领域,用户留存是一个关键指标,它反映了产品吸引并保留用户的能力。 留存率的计算不仅有助于评估产品的健康状况,还能为产品优化和市场策略提供重要依据。 本文将详细介绍如何在大数据开发中计算用户留存,并附带具体…

大数据之路 读书笔记 Day2

大数据之路 读书笔记 Day2 日志采集——浏览器的页面采集 一、分类 #mermaid-svg-8c9sRexRDdSB9pWA {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8c9sRexRDdSB9pWA .error-icon{fill:#552222;}#mermaid-svg-8c9…

【论文解读】CVPR2024:DUSt3R: Geometric 3D Vision Made Easy

论文“”https://openaccess.thecvf.com/content/CVPR2024/papers/Wang_DUSt3R_Geometric_3D_Vision_Made_Easy_CVPR_2024_paper.pdf 代码:GitHub - naver/dust3r: DUSt3R: Geometric 3D Vision Made Easy DUSt3R是一种旨在简化几何3D视觉任务的新框架。作者着重于…

002-关于Geogebra软件的介绍及与MatLab的区别

为什么要学Geogebra? 因为和MatLab的科学计算相比,GeoGebra重点突出教学展示,对于教师、学生人群来讲再合适不过了,尤其是可以融入到PPT里边呈现交互式动画,想想听众的表情!这不就弥补了看到PPT播放数学公…

邮箱smtp发送邮件失败的原因?怎么做排查?

邮箱smtp发送邮件失败的解决方法?SMTP错误代码解析! 在使用SMTP发送邮件时,我们时常会遇到各种问题,导致邮件发送失败。了解这些问题的根本原因可以帮助我们更好地解决它们。AoKSend将详细探讨邮箱SMTP发送邮件失败的几大原因&am…

在 WebGPU 与 Vulkan 之间做出正确的选择(Making the Right Choice between WebGPU vs Vulkan)

在 WebGPU 与 Vulkan 之间做出正确的选择(Making the Right Choice between WebGPU vs Vulkan) WebGPU 和 Vulkan 之间的主要区别WebGPU 是什么?它适合谁使用?Vulkan 是什么?它适合谁使用?WebGPU 和 Vulkan…

mac 上 Docker Desktop的免费开源的替代工具Colima

当谈到在macOS上运行容器时,Docker长期以来一直是首选。但是,必须解决使用适用于macOS的Docker Desktop时出现的一些限制,特别是对于大中型公司,最大的问题是需要购买许可证。另外,macOS 版Docker Desktop的性能问题也…

单调栈(左小大,右小大)

①寻找每个数左边第一个比它小的数 给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。 输入样例: 3 4 2 7 5 输出样例: -1 3 -1 2 2 从左到右遍历,用单调递增(栈底到栈顶…

c->c++(二):class

本文主要探讨C类的相关知识。 构造和析构函数 构造函数(可多个):对象产生时调用初始化class属性、分配class内部需要的动态内存 析构函数(一个):对对象消亡时调用回收分配动态内存 C提供默认构造和析构,…

行人检测技术:思通数科大模型在自动驾驶安全中的应用

在自动驾驶技术飞速发展的今天,行人检测已成为确保道路交通安全的关键技术之一。本文将探讨如何结合思通数科大模型和计算机视觉技术,实现在城市交通环境中对行人的高效检测,为自动驾驶车辆提供必要的行人安全保障。 引言 行人检测技术是利…

Dubbo内部通信流程

我当时在学习的过程中搭建过demo,具体流程就是,我先定义了一个api接口模块,还定义一个服务提供者模块,然后服务提供方实现该接口,定义该方法具体的实现impl类,服务提供方启动时,将要暴露的服务和…

【架构-20】死锁

什么是死锁? 死锁(Deadlock)是指两个或多个线程/进程在执行过程中,由于资源的互相占用和等待,而陷入一种互相等待的僵局,无法继续往下执行的情况。 产生死锁的四个必要条件: (1)互斥条件(Mutual Exclusion):至少有一个资源是非共享…

跨阻放大器

#创作灵感# 最近涉及到微电流的监测项目,而里面的核心就是跨阻放大器,所以这里做一个简单的介绍,后续等项目完成了,再做一个实例的介绍。 #正文# 跨阻放大器(Transimpedance Amplifier, TIA)是一种将输入电…

Windows编程之多线程事件对象(Event Object)用法详解

目录 一、前言 二、基础用法 三、API详解 1.创建事件对象 2控制事件状态 3.等待事件对象: 四、实战案例 1.案例描述 2.代码设计 3.总设计代码 4.运行结果 一、前言 事件对象(Event Object)是我们在大型项目中,进行多线…

股价持续低迷,业绩颓势不减,冀光恒难救平安银行?

文|新熔财经 作者|宏一 周一一上班,就听到旁边的同事感慨今年股市行情很不错,尤其是银行股,上半年累计上涨了17.02%,是涨幅最大的板块。 听到这里,我美滋滋地打开自己的账户,结…

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

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

照明物联网:基于网关的智能照明云监控系统解决方案

智能照明系统就是利用物联网技术,将同一空间的照明、空调、新风、排风等系统共同接入物联网平台,实现了“设备互联、数据互通”的智慧物联能力。照明数据、环境监测数据通过网关上传云端,在云端进行统计分析并将结果通过各种终端共享&#xf…

MySQL—常用的数据类型

数据类型 整型 1.创建一个含有无符号/有符号整型的字段的表 CREATE TABLE L1(id tinyint unsigned #无符号 ) CREATE TABLE L2(id tinyint #默认为有符号 ) 数值型(bit) 2.数值型(bit)的使用 小数 3.数值型(小数)的基本使用 字符串 4.字符串的基本使用 #演示字符串类型…

REGX52.H报错

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