首页 > 数据库 >Redis中pipeline(管道)详解

Redis中pipeline(管道)详解

时间:2024-07-29 10:00:05浏览次数:16  
标签:pipeline 批量 Redis 命令 管道 详解 服务端 客户端

redis管道pipeline

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

概念

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

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

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

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

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

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

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

Redis提供了批量操作命令(例如 mgetmset等),有效的节约 RTT.但大部分命令是不支持批量操作的,例如要执行 n次 hgetall命令,并没有 mhgetall存在,需要消耗 n次 RTTRedis的客户端和服务端可能不是在不同的机器上.例如客户端在北京, 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中的管道机制。

标签:pipeline,批量,Redis,命令,管道,详解,服务端,客户端
From: https://blog.csdn.net/2301_76166241/article/details/140720651

相关文章

  • (BS ISO 11898-1:2015)CAN_FD 总线协议详解5- MAC子层描述4
    5.5帧编码帧中的比特流应按照不归零(NRZ,Non-Return-to-Zero)方法进行编码。这意味着在整个比特时间内生成的比特电平是恒定不变的。为了限制可用于同步的最大边沿(即信号波形的上升沿或下降沿)间距,帧的不同部分如起始边界(SOF,StartofFrame)、仲裁字段、控制字段、数据字段以......
  • VO、DTO、Entity:Java 应用中的数据对象详解
    在Java应用程序中,特别是在基于微服务架构的应用中,数据对象(DataObjects)扮演着非常重要的角色。它们不仅有助于组织和传输数据,还能确保应用程序各部分之间的解耦。本文将深入探讨VO(ViewObject)、DTO(DataTransferObject)和Entity之间的区别,并讨论它们在实际项目中的应......
  • proc/meminfo详解
    [root@iZ2ze7ukvpkonzby0h3wbfZ~]#cat/proc/meminfoMemTotal:16265476kB//可用的总内存MemFree:212936kB//完全未用到的物理内存LowFree+HighFreeMemAvailable:1968228kB//MemAvailable≈MemFree+Buffers+CachedBuffers:......
  • 电动垂起固定翼+倾斜摄影+激光数据:实时三维城市采集技术详解
    电动垂起固定翼无人机结合倾斜摄影与激光数据技术,为实时三维城市采集提供了高效、精确的解决方案。以下是对这一技术的详细解析:一、电动垂起固定翼无人机1.无人机特点垂直起降能力:电动垂起固定翼无人机结合了固定翼和多旋翼的优点,能够在有限的起降空间内实现垂直起降,从而适......
  • 无人机运营合格证及AOPA飞行执照技术详解
    随着无人机技术的飞速发展,其在航拍、农业、物流、环境监测、应急救援等领域的应用日益广泛,无人机运营与飞行人员的规范化管理显得尤为重要。本文将围绕无人机运营合格证(简称“合格证”)及中国航空器拥有者及驾驶员协会(AOPA)颁发的飞行执照进行技术详解,涵盖其定义、技术培训要点、......
  • ossutil命令详解
    ossutil是阿里云提供的一款命令行工具,用于管理和操作阿里云对象存储服务(OSS)。以下是ossutil常用的一些命令和功能:安装和配置安装ossutil:可以从阿里云官网下载对应平台的ossutil安装包https://help.aliyun.com/zh/oss/developer-reference/install-ossutil?spm=a2......
  • Vuex和Pinia详解
    Vuex基础知识Vuex是一个专为Vue.js应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex的核心构成要素包括:State(状态):存储应用的状态。Getter(获取器):从状态中派生出状态。Mutation(突变):同步地更......
  • 【Python学习手册(第四版)】学习笔记06-Python动态类型-赋值模型详解
    个人总结难免疏漏,请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。主要介绍Python的动态类型(也就是Python自动为跟踪对象的类型,不需要在脚本中编写声明语句),Python中变量和对象是如何通过引用关联,垃圾收集的概念,对象共享引用是如何影响多个变量......
  • Python学习手册(第四版)】学习笔记09.3-Python对象类型-分类、引用VS拷贝VS深拷贝、比较
    个人总结难免疏漏,请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。这部分稍杂,视需要选择目录读取。主要讲的是对之前的所有对象类型作复习,以通俗易懂、由浅入深的方式进行介绍,所有对象类型共有的特性(例如,共享引用),引用、拷贝、深拷贝,以及比较、......
  • 简单工厂模式详解
    一,概述        简单工厂模式属于创建型模式又叫做静态工厂方法模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。        简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。      ......