Redis中pipeline(管道)详解

news2025/5/21 21:22:37
redis管道pipeline

举个例子: 小卖铺免费让你拿50瓶饮料,你是一次拿一瓶拿回家,还是打包一次或者多次拿回家?

概念

Redis管道(pipelining)是一种在客户端向服务端发送多个请求而不等待响应的技术。它可以显著提高Redis应用程序的性能。 管道的主要思想是客户端向服务端发送多个请求,而不等待这些请求的响应。这避免了在每个请求之间等待往返延迟。 使用Redis管道主要有以下好处:

  • 减少往返延迟 。不需在每个请求间等待,效率更高。

  • 优化网络利用率。在管道中打包多个请求,网络传输更有效。

  • 简化多次请求的程序逻辑。通过管道可以避免重复的连接、发送等代码。

Redis客户端执行一条命令分为以下四个步骤:

1.发送命令
2.命令排队
3.命令执行
4.返回结果

其中,第一步+第四步称为RoundTripTime(RTT,往返时间).

Redis提供了批量操作命令(例如mget,mset等),有效的节约RTT.但大部分命令是不支持批量操作的,例如要执行nhgetall命令,并没有mhgetall存在,需要消耗nRTT.Redis的客户端和服务端可能不是在不同的机器上.例如客户端在北京,Redis服务端在上海,两地直线距离为1300公里,那么1次RTT时间=1300×2/(300000×2/3)=13毫秒(光在真空中传输速度为每秒30万公里,这里假设光纤的速度为光速的2/3),那么客户端在1秒内大约只能执行80次左右的命令,这个和Redis的高并发高吞吐背道而驰。

Pipeline(流水线)机制能改善上面这类问题,它能将一组Redis命令进行组装,通过一次RTT传输给Redis,再将这组Redis命令按照顺序执行并装填结果返回给客户端。图1.1中未使用Pipeline执行了n次命令,整个过程需要n个RTT

Pipeline并不是什么新的技术和机制,很多技术上都使用过.而且RTT在不同网络环境下会有不同,例如同机房和同机器会比较快,跨机房跨地区会比较慢.Redis命令真正执行的时间通常在微秒级别,所以才会有Redis性能瓶颈是网络这样的说法。

Pipeline 底层原理分析
Redis单个命令执行基本步骤

Redis是一种基于客户端-服务端模型以及请求/响应的TCP服务。一次Redis客户端发起的请求,经过服务端的响应后,大致会经历如下的步骤:

  1. 客户端发起一个(查询/插入)请求,并监听socket返回,通常情况都是阻塞模式等待Redis服务器的响应。

  2. 服务端处理命令,并且返回处理结果给客户端。

  3. 客户端接收到服务的返回结果,程序从阻塞代码处返回。

RTT 时间

Redis客户端和服务端之间通过网络连接进行数据传输,数据包从客户端到达服务器,并从服务器返回数据回复客户端的时间被称之为RTT(Round Trip Time - 往返时间)。我们可以很容易就意识到,Redis在连续请求服务端时,如果RTT时间为250ms, 即使Redis每秒能处理100k请求,但也会因为网络传输花费大量时间,导致每秒最多也只能处理4个请求,导致整体性能的下降。

Redis Pipeline

为了提升效率,这时候Pipeline出现了。Pipelining不仅仅能够降低RRT,实际上它极大的提升了单次执行的操作数。这是因为如果不使用Pipelining,那么每次执行单个命令,从访问数据的结构和服务端产生应答的角度,它的成本是很低的。但是从执行网络IO的角度,它的成本其实是很高的。其中涉及到read()和write()的系统调用,这意味着需要从用户态切换到内核态,而这个上下文的切换成本是巨大的。

当使用Pipeline时,它允许多个命令的读通过一次read()操作,多个命令的应答使用一次write()操作,它允许客户端可以一次发送多条命令,而不等待上一条命令执行的结果。**不仅减少了RTT,同时也减少了IO调用次数(IO调用涉及到用户态到内核态之间的切换),最终提升程序的执行效率与性能。**如下图:

要支持Pipeline,其实既要服务端的支持,也要客户端支持。对于服务端来说,所需要的是能够处理一个客户端通过同一个TCP连接发来的多个命令,可以理解为,这里将多个命令切分,和处理单个命令一样,Redis就是这样处理的。而客户端,则是要将多个命令缓存起来,缓冲区满了就发送,然后再写缓冲,最后才处理Redis的应答。

Pipeline实际应用场景

管道在Redis中具有广泛的实际应用场景,主要包括数据导入导出、数据处理、批量操作等。下面将详细介绍这些场景及其在Redis中的应用。

数据导入导出
场景描述

数据导入导出是指将数据从Redis中导出到其他存储介质,或者从其他存储介质导入到Redis中。这种场景通常发生在数据迁移、备份恢复、数据同步等操作中。

管道应用

管道可以用于批量导入导出数据。将多个数据操作命令打包成一个请求发送到服务器,减少了网络通信的开销,提高了数据导入导出的效率。

# 开启管道模式
PIPELINE

# 批量导出数据
DUMP key1
DUMP key2

# 执行管道中的所有命令
EXEC
数据处理
场景描述

数据处理是指对Redis中的数据进行批量处理、转换、过滤等操作。这种场景通常发生在数据清洗、数据分析、数据转换等操作中。

管道应用

管道可以用于批量处理数据。将多个数据处理命令打包成一个请求发送到服务器,减少了网络通信的开销,提高了数据处理的效率。

# 开启管道模式
PIPELINE

# 批量处理数据
INCR key1
INCRBY key2 10

# 执行管道中的所有命令
EXEC
批量操作
场景描述

批量操作是指对Redis中的多个键进行批量操作,如设置多个键的值、删除多个键等。这种场景通常发生在批量任务处理、批量数据更新等操作中。

管道应用

管道可以用于批量执行多个操作。将多个操作命令打包成一个请求发送到服务器,减少了网络通信的开销,提高了操作的执行效率。

# 开启管道模式
PIPELINE

# 批量设置值
SET key1 value1
SET key2 value2

# 批量删除键
DEL key1
DEL key2

# 执行管道中的所有命令
EXEC
其他应用场景

除了上述应用场景外,管道还可以用于实现原子性操作、事务处理等功能。例如,可以将多个命令打包成一个事务发送到服务器,保证了事务中的多个操作的原子性。

总 结

管道是一种在Redis中提高命令批量执行效率的机制,通过将多个命令一次性发送到服务器并一次性接收响应,减少了网络通信的开销,提高了命令执行的效率。通过管道,可以实现数据导入导出、数据处理、批量操作等功能,提高了Redis的性能和可扩展性。希望本文的介绍能够帮助读者更深入地理解和应用Redis中的管道机制。

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

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

相关文章

01-Chromedriver下载与配置(mac)

下载地址: 这里我用的最后一个,根据自己chrome浏览器选择相应的版本号即可 ChromeDriver官网下载地址:https://sites.google.com/chromium.org/driver/downloads ChromeDriver官网最新版下载地址:https://googlechromelabs.git…

【Linux操作系统】Linux常用一键脚本

Linux网络加速脚本 Linux网络加速脚本可以替换Linux内核和更改TCP拥塞算法的一键脚本,包括安装BBR内核、XANMOD官方内核,开启BBR加速等功能,总之非常强大。 不卸载内核脚本(一般用这个) wget -O tcpx.sh "http…

Linux -文件系统的备份

本文为Ubuntu Linux操作系统- 第九弹~~ 今天接着上文的内容,讲Linux磁盘存储管理最后一部分内容~ 上期回顾:Linux 图形界面工具管理磁盘分区和文件系统 😎黑犀铠甲合体,流星枪之狂瀑扎帖,碎魔伏暴,灭于狂瀑…

ECharts实战教程:如何生成动态水波纹效果

导语:在数据可视化领域,ECharts是一款非常强大的图表库。今天,我们将带领大家学习如何使用ECharts生成动态水波纹效果,让我们的图表更加生动有趣。 一、准备工作 首先,我们需要准备一些基础数据,如下所示&…

PyQt信号槽实现页面的登录与跳转 #页面进一步优化

将登录框中的取消按钮使用信号和槽的机制,关闭界面。 将登录按钮使用信号和槽连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否为"admin",密码是否为"123456",如果账号密码匹配成功,当前界面关…

STM32CUBEMX+STM32F405RGT6+I2C+AT24C02学习应用

I2C 通讯 机制 较为 繁琐 , 但是I2C的速率比较低,而且EEPROM的容量不大,比如AT24C02的容量 只有 2Kb,即256B(字节)。 对于 想快速实现I 2 C 功能应用,我们借助STM32的HAL库函数 可以 做到 。 一…

Python 基础学习(一)

一.基础语法 注释 Python中单行注释以 # 开头,如下: #!/usr/bin/python3# 第一个注释 print ("Hello, Python!") # 第二个注释多行注释可以用多个 # 号,还有 ‘’’ 和 “”": #!/usr/bin/python3# 第一个注释…

guava 整合springboot 自定义注解实现接口鉴权调用保护

文章目录 一、简要概述二、实现过程1. pom引入依赖2. 自定义注解3. 定义切面4. 定义权限检查逻辑 三、注解使用四、运行结果五、源码放送 一、简要概述 Guava Cache是一个全内存的本地缓存实现,它提供了线程安全的实现机制。我们借助expireAfterWrite过期时间设置和…

Redis实战篇(二:商户查询缓存)

目录 三、商户查询缓存 1.缓存介绍 2.添加商户缓存 (1)缓存模型和思路 (2)代码实现 3.店铺类型缓存 4.缓存更新策略 5.实现商铺缓存与数据库双写一致 6.缓存穿透 (1)介绍 (2&#x…

etcd分布式存储系统快速入门指南

在分布式系统的复杂世界中,确保有效的数据管理至关重要。分布式可靠的键值存储在维护跨分布式环境的数据一致性和可伸缩性方面起着关键作用。 在这个全面的教程中,我们将深入研究etcd,这是一个开源的分布式键值存储。我们将探索其基本概念、特…

Spring Boot + Spring AI快速体验

Spring AI快速体验 1 什么是Spring AI主要功能 2 快速开始2.1 版本说明2.2 配置文件2.3 pom依赖2.3.1 spring maven仓库2.3.2 核心依赖 2.4 定义ChatClient2.5 启动类2.6 测试 3 参考链接 1 什么是Spring AI Spring AI是Spring的一个子项目,是Spring专门面向于AI的…

【网络篇】TCP知识

TCP首部格式? 为什么需要 TCP 协议? TCP 工作在哪一层? IP 层是不可靠的,它不保证网络包的交付、不保证网络包的按序交付也不保证网络包中的数据的完整性。如果需要保障网络数据包的可靠性,那么就需要由上层&#xff0…

【Liunx篇】基础开发工具 - yum

文章目录 🌵一.Liunx下安装软件的方案🐾1.源代码安装🐾2.rpm包安装🐾3.包管理器进行安装 🌵二.软件包管理器-yum🌵三.yum的具体操作🐾1.查看软件包🐾2.安装软件包🐾3.卸载…

Co-Slam论文及复现记录

Overview 输入RGB-D流: { I t } t 1 N { D t } t 1 N \{I_t\}^{N}_{t1}\{D_t\}^{N}_{t1} {It​}t1N​{Dt​}t1N​,它们带有已知相机内参 K ∈ R 3 3 K\in \mathbb{R}^{3\times 3} K∈R33。通过联合优化相机姿态 { ξ t } t 1 N \{\xi_t\}^{N}_{t1} {…

《探索形象克隆:科技与未来的奇妙融合》

目录 一、什么是形象克隆 二、形象克隆的技术原理 三、形象克隆的发展现状 四、形象克隆的未来趋势 五、形象克隆的应用场景 六、形象克隆简单代码案例 Python 实现数字人形象克隆 Scratch 实现角色克隆效果(以猫为例) JavaScript 实现 Scratc…

解决view-ui-plus 中表单验证不通过问题,select 组件开启multiple模式 总是提示错误,即使不验证也提示,有值也验证失败

😉 你好呀,我是爱编程的Sherry,很高兴在这里遇见你!我是一名拥有十多年开发经验的前端工程师。这一路走来,面对困难时也曾感到迷茫,凭借不懈的努力和坚持,重新找到了前进的方向。我的人生格言是…

ARM V8 GIC中断模块

文章目录 1. 缩略语2. 简介2.1. 中断类型2.1.1 SGI软件中断2.1.2 PPI私有外设中断2.1.3 SPI 共享外设中断2.1.4 LPI(locality-specific peripheral interrupts) 2.2. GIC 架构2.2.1 Distributor2.2.2 Redistributor2.2.3 CPU Interfaces 2.3. 属性层次(affinity&…

perl Window安装教程

perl Window安装教程 下载地址 https://platform.activestate.com/tangxing806/ActivePerl-5.28/distributions 运行state-remote-installer.exe 按下图截图步骤 检查perl版本 参考文献: perl安装教程

算法日记(2024.12.09)

1.二叉树的最小深度 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:2 …

《操作系统 - 清华大学》6 -5:局部页面置换算法:最不常用置换算法 (LFU, Least Frequently Used)

文章目录 1. 最不常用算法的工作原理2.最不常用算法特征3. 示例 1. 最不常用算法的工作原理 最不常用算法:注意并不是表示算法本身不常用,而是采取最不常使用页面的策略,Least Frequently Used, LFU。LRU 是最久未被访问的页&…