2023-06-03:redis中pipeline有什么好处,为什么要用 pipeline?
2023-06-03:redis中pipeline有什么好处,为什么要用 pipeline?
答案2023-06-03:
Redis客户端执行一条命令通常包括以下四个阶段:
1.发送命令:客户端将要执行的命令发送到Redis服务器。
2.命令排队:Redis服务器将收到的命令放入队列中,按照先进先出(FIFO)的原则等待执行。
3.命令执行:当Redis服务器轮到该命令时,执行该命令并返回结果。在执行期间,Redis服务器可能会读取或修改数据库中的数据,或者执行其他操作。
4.返回结果:Redis服务器将结果返回给客户端,客户端可以使用该结果进行后续的操作。

其中,第1步和第4步所需的时间被称为往返时间(Round Trip Time,RTT),即指数据在网络上传输的来回时间。
Redis提供了批量操作命令(例如 mget、mset 等),这些命令允许客户端一次发送多个命令或数据,并且将结果一次性返回给客户端,有效地节约了往返时间(RTT)。
但是需要注意的是,虽然 Redis 提供了批量操作命令,但并不是所有命令都支持批量操作。例如,如果需要执行 n 次 hgetall 命令,因为没有 mhgetall 命令等价于 MGET 命令,所以需要执行 n 次单独的 hgetall 命令,这将会消耗 n 次 RTT。
举例:Redis的客户端和服务端可能部署在不同的机器上。例如客户端在本地,Redis服务器在阿里云的广州,两地直线距离约为800公里,那么1次RTT时间=800 x2/ ( 300000×2/3 ) =8毫秒,(光在真空中传输速度为每秒30万公里,这里假设光纤为光速的2/3 )。而Redis命令真正执行的时间通常在微秒(1000微妙=1毫秒)级别,所以才会有Redis 性能瓶颈是网络这样的说法。
为了解决这种需要频繁与 Redis 服务器通信的问题,Redis 提供了 Pipeline(流水线)机制。Pipeline 可以将一组 Redis 命令进行组装,在一次 RTT 中将它们发送给 Redis,再将这组 Redis 命令的执行结果按顺序返回给客户端。相比于单独执行每个命令并每个命令都需要一次 RTT 的方式,使用 Pipeline 可以大幅减少网络延迟的数量。没有使用Pipeline执行了n条命令,整个过程需要n次RTT。

使用Pipeline 执行了n次命令,整个过程只需要1次RTT。

Pipeline 并不是一个新的技术或机制,而是一种已经被广泛使用的技术。在其他技术中,例如数据库、消息队列和分布式系统等领域,也有类似的机制用于减少网络延迟。
此外,在不同的网络环境下,往返时间(RTT)可能会有所不同。例如,在同一数据中心内的机器之间进行通信时,由于网络延迟较低,RTT 时间通常会更快。而当两个机器在不同的地理位置且距离较远时,RTT 时间可能会更长。
Redis 命令行客户端 redis-cli 的 --pipe 选项实际上就是使用 Pipeline 机制,允许用户一次性发送多个 Redis 命令,并一次性接收多个命令的返回结果。这样可以有效地减少网络延迟数量,并提高 Redis 的性能和可靠性。
但在大多数情况下,我们更倾向于使用 Java 语言的 Redis 客户端中的 Pipeline。这是因为 Java 客户端可以很方便地集成到应用程序的代码中,并且提供了更多的功能和灵活性。例如,Java 客户端通常支持异步操作、连接池管理、失败重试等特性,可以帮助开发者轻松地构建高性能的 Redis 应用程序。
总的来说,在不同网络环境下非Pipeline和Pipeline执行10000次set操作的效果,在执行时间上的比对如下:

差距有100多倍。在不同网络环境下,执行 10000 次 set 操作时,使用 Pipeline 和逐条执行的速度差异可能会非常大。例如,在网络延时较大的情况下,Pipeline 的效果尤为明显。据此可以得到如下两个结论:
1.使用 Pipeline 执行多个 Redis 命令,通常比逐条执行要快。这是因为 Pipeline 可以将多个命令一次性发送给 Redis 服务器,并一次性接收多个命令的返回结果,从而减少了网络传输和等待时间,提高了 Redis 的性能和响应速度。
2.客户端和服务端之间的网络延迟越大,Pipeline 的优势越明显。这是因为在网络延迟较大的情况下,每个命令执行完成后需要等待很长时间才能执行下一个命令。而使用 Pipeline,客户端可以将多个命令一次性发送给 Redis 服务器,并一次性接收多个命令的返回结果,从而减少了等待时间,提高了 Redis 的性能和可靠性。
2023-06-03:redis中pipeline有什么好处,为什么要用 pipeline?的更多相关文章
- Redis 中的原子操作(3)-使用Redis实现分布式锁
Redis 中的分布式锁如何使用 分布式锁的使用场景 使用 Redis 来实现分布式锁 使用 set key value px milliseconds nx 实现 SETNX+Lua 实现 使用 R ...
- Redis 中的事务分析,Redis 中的事务可以满足ACID属性吗?
Redis 中的事务 什么是事务 1.原子性(Atomicity) 2.一致性(Consistency) 3.隔离性(Isolation) 4.持久性(Durability) 分析下 Redis 中的 ...
- .NET客户端实现Redis中的管道(PipeLine)与事物(Transactions)
序言 Redis中的管道(PipeLine)特性:简述一下就是,Redis如何从客户端一次发送多个命令,服务端到客户端如何一次性响应多个命令. Redis使用的是客户端-服务器模型和请求/响应协议的T ...
- 往redis中存储数据是利用pipeline方法
在redis中保存数据时,保存和设置有效时间是分开写的话,如果中间出现的异常,这会导致数据永久有效,因此就可以采用pipeline方法. # 创建redis管道对象,可以一次执行多个语句 pipeli ...
- Redis中的管道(PipeLine)与事物(Transactions)
Redis中的管道(PipeLine)与事物(Transactions) 序言 Redis中的管道(PipeLine)特性:简述一下就是,Redis如何从客户端一次发送多个命令,服务端到客户端如何一次 ...
- Jedis客户端即redis中的pipeline批量操作
关注公众号:CoderBuff,回复"redis"获取<Redis5.x入门教程>完整版PDF. <Redis5.x入门教程>目录 第一章 · 准备工作 第 ...
- 关于Redis中的serverCron
1.serverCron简介 在 Redis 中, 常规操作由 redis.c/serverCron 实现, 它主要执行以下操作 /* This is our timer interrupt, cal ...
- 超大批量删除redis中无用key+配置
目前线上一个单实例redis中无用的key太多,决定删除一部分. 1.删除指定用户的key,使用redis的pipeline 根据一定条件把需要删除的用户统计出来,放到一个表里面,表为 del_use ...
- android 1.6 launcher研究之自定义ViewGroup (转 2011.06.03(二)——— android 1.6 launcher研究之自定义ViewGroup )
2011.06.03(2)——— android 1.6 launcher研究之自定义ViewGroup2011.06.03(2)——— android 1.6 launcher研究之自定义ViewG ...
- Redis中是如何实现分布式锁的?
分布式锁常见的三种实现方式: 数据库乐观锁: 基于Redis的分布式锁: 基于ZooKeeper的分布式锁. 本地面试考点是,你对Redis使用熟悉吗?Redis中是如何实现分布式锁的. 要点 Red ...
随机推荐
- Spring AOP面向切面编程案例 (注解驱动开发)
AOP(动态代理):指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式:[1]导入 aop 模块:Spring AOP:(spring-aspects):[2]定义一个业务逻辑类 ...
- 这可能是最全面的Spring面试题总结了
Spring是什么? Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架. Spring的优点 通过控制反转和依赖注入实现松耦合. 支持面向切面的编程,并且把应用业务逻辑和系统 ...
- IDEA中隐藏问文件或者文件夹
点击+,输入要隐藏的文件名,支持*通配符 回车确认
- Junit5 pom依赖
<dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter- ...
- Android View的事件分发机制-源码解析
为了更好的研究View的事件转发,我们自定以一个MyButton继承Button,然后把跟事件传播有关的方法进行复写,然后添加上日志: 然后把我们自定义的按钮加到主布局文件中: public clas ...
- DG:RFS[8]: No standby redo logfiles created for thread 2
环境:两节点的RAC在线搭建DG,处理报错 现象:RFS[8]: No standby redo logfiles created for thread 2 ,thread2 没有建立redo Tue ...
- python移动同名文件
import os import shutil def split_name(file): file_name, _ = file.split('.') return file_name def mo ...
- 使用 LoRA 和 Hugging Face 高效训练大语言模型
在本文中,我们将展示如何使用 大语言模型低秩适配 (Low-Rank Adaptation of Large Language Models,LoRA) 技术在单 GPU 上微调 110 亿参数的 F ...
- 创建SpringBoot项目,在yml中配置数据库, driver-class-name: com.mysql.cj.jdbc.Driver标红报错解决方式
一.报错原因 com.mysql.cj.jdbc.Driver一直标红报错,原因在于pom.xml中mysql包没有下载下来,或者在创建项目的时候有问题 二.解决方案 在pom.xml添加 <d ...
- 通过命令快速找到python的路径
查询Python 首先我们需要知道Python安装路径,可以在命令行中逐行执行下面代码 python3 import sys sys.executable