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 ...
随机推荐
- Kafka 消费者读取数据
消费者不需要自行管理 offset(分组+topic+分区),系统通过 broker 将 offset 存放在本地.低版本通过 zk 自行管理.系统自行管理分区和副本情况.消费者断线后会自动根据上一次 ...
- Redis 缓存雪崩 |击穿 |穿透 概念及解决方案
一.雪崩 1.概念 指某一时间段,缓存集中过期失效,无数的请求绕开缓存,直接访问数据库. 2.解决方案 让redis数据永不过期,这种方式最可靠的.最安全的,但占用空间,内存消耗大,并且不能保持数据 ...
- 火山引擎 A/B 测试产品——DataTester 私有化架构分享
作为一款面向 ToB 市场的产品--火山引擎A/B测试(DataTester)为了满足客户对数据安全.合规问题等需求,探索私有化部署是产品无法绕开的一条路. 在面向 ToB 客户私有化的实际落地中,火 ...
- 使用Kubernetes快速启用一个静态页面
使用Kubernetes快速启用一个静态页面 将html静态页面放置在nfs目录下,通过Deployment启动时挂在到nginx页面目录即可 查看yaml内容 root@hello:~# cat c ...
- 回顾.NET系列:Framework、Net Core、Net 过往
目录 一.个人最近工作变化 二.Framework.Net Core..NET 时过境迁 Framework:爱你定格在4.8 .Net Foundation:.Net变革大脑 重新统一的 .NET ...
- day128:MySQL进阶:MySQL安装&用户/权限/连接/配置管理&MySQL的体系结构&SQL&MySQL索引和执行计划
目录 1.介绍和安装 2.基础管理 2.1 用户管理 2.2 权限管理 2.3 连接管理 2.4 配置管理 3.MySQL的体系结构 4.SQL 5.索引和执行计划 1.介绍和安装 1.1 数据库分类 ...
- day68:Vue:类值操作/style样式操作&v-for&filer/computed/watch&生命周期钩子函数&axios
目录 1.类值操作 :class 2.style操作样式 :style 3:示例:选项卡 @click+:class 4.v-for示例:循环商品显示 5.过滤器:filter 6.计算属性:comp ...
- Linux升级安装GCC
各发行版本Linux中,其自带的gcc安装源版本都比较旧,我所使用CentOS 6系统中,gcc版本只有4.4.7.最近要安装几个软件要求gcc 4.8+,无奈只能手动升级gcc. 1. 下载最新版本 ...
- Yii framework 应用小窍门
Yii framework 应用小窍门 1. Yii Framework] 如何获取当前controller的名称? 下面语句就可以获取当前控制器的名称了! Php代码 Yii::app ...
- c/c++零基础坐牢第三天
c/c++从入门到入土(3) 开始时间2023-04-17 19:07:20 结束时间2023-04-17 20:53:40 前言:经过三天的算法训练,大家肯定对后面的编程知识产生浓厚的兴趣,有了前两 ...