Redis--10--Pipeline

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • Pipeline
    • 举例
    • 比较普通模式与 PipeLine 模式
    • 小结:


Pipeline

前面我们已经说过,Redis客户端执行一条命令分为如下4个部分:1)发送命令2)命令排队3)命令执行4)返回结果。

image.png

其中1和4花费的时间称为Round Trip Time (RTT,往返时间),也就是数据在网络上传输的时间。

Redis提供了批量操作命令(例如mget、mset等),有效地节约RTT。

但大部分命令是不支持批量操作的,例如要执行n次 hgetall命令,并没有mhgetall命令存在,需要消耗n次RTT。

举例

举例:Redis的客户端和服务端可能部署在不同的机器上。例如客户端在本地,Redis服务器在阿里云的广州,两地直线距离约为800公里,那么1次RTT时间=800 x2/ ( 300000×2/3 ) =8毫秒,(光在真空中传输速度为每秒30万公里,这里假设光纤为光速的2/3 )。而Redis命令真正执行的时间通常在微秒(1000微妙=1毫秒)级别,所以才会有Redis 性能瓶颈是网络这样的说法。

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

image.png

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

image.png

Pipeline并不是什么新的技术或机制,很多技术上都使用过。而且RTT在不同网络环境下会有不同,例如同机房和同机器会比较快,跨机房跨地区会比较慢。

redis-cli的–pipe选项实际上就是使用Pipeline机制,但绝对部分情况下,我们使用Java语言的Redis客户端中的Pipeline会更多一点。

比较普通模式与 PipeLine 模式

测试环境:
  Windows:Eclipse + jedis2.9.0 + jdk 1.7
  Ubuntu:部署在虚拟机上的服务器 Redis 3.0.7

	/** 测试普通模式与 PipeLine 模式的效率: * 测试方法:向 redis 中插入 10000 组数据*/public static void testPipeLineAndNormal(Jedis jedis)throws InterruptedException {Logger logger = Logger.getLogger("javasoft");long start = System.currentTimeMillis();for (int i = 0; i < 10000; i++) {jedis.set(String.valueOf(i), String.valueOf(i));}long end = System.currentTimeMillis();logger.info("the jedis total time is:" + (end - start));Pipeline pipe = jedis.pipelined(); // 先创建一个 pipeline 的链接对象long start_pipe = System.currentTimeMillis();for (int i = 0; i < 10000; i++) {pipe.set(String.valueOf(i), String.valueOf(i));}pipe.sync(); // 获取所有的 responselong end_pipe = System.currentTimeMillis();logger.info("the pipe total time is:" + (end_pipe - start_pipe));BlockingQueue<String> logQueue = new LinkedBlockingQueue<String>();long begin = System.currentTimeMillis();for (int i = 0; i < 10000; i++) {logQueue.put("i=" + i);}long stop = System.currentTimeMillis();logger.info("the BlockingQueue total time is:" + (stop - begin));}

在这里插入图片描述

小结:

1、Pipeline执行速度一般比逐条执行要快。

2、客户端和服务端的网络延时越大,Pipeline的效果越明显。

Pipeline虽然好用,但是每次Pipeline组装的命令个数不能没有节制,否则一次组装Pipeline数据量过大,一方面会增加客户端的等待时间,另一方面会造成一定的网络阻塞,可以将一次包含大量命令的Pipeline拆分成多次较小的Pipeline来完成,比如可以将Pipeline的总发送大小控制在内核输入输出缓冲区大小之内或者控制在单个TCP 报文最大值1460字节之内。

内核的输入输出缓冲区大小一般是4K-8K,不同操作系统会不同(当然也可以配置修改)

最大传输单元(Maximum Transmission Unit,MTU),这个在以太网中最大值是1500字节。那为什么单个TCP 报文最大值是1460,因为因为还要扣减20个字节的IP头和20个字节的TCP头,所以是1460。

同时Pipeline只能操作一个Redis实例,但是即使在分布式Redis场景中,也可以作为批量操作的重要优化手段。

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

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

相关文章

echarts 地图

效果图 业务组件 <template><mapEcharts :itemStyle"mapProps.itemStyle" :emphasisLabelStyle"mapProps.emphasisLabelStyle":emphasisItemStyle"mapProps.emphasisItemStyle" :labelInfo"mapProps.labelInfo":rippleEffec…

LeetCode 2661. 找出叠涂元素:多次映射

【LetMeFly】2661.找出叠涂元素&#xff1a;多次映射 力扣题目链接&#xff1a;https://leetcode.cn/problems/first-completely-painted-row-or-column/ 给你一个下标从 0 开始的整数数组 arr 和一个 m x n 的整数 矩阵 mat 。arr 和 mat 都包含范围 [1&#xff0c;m * n] 内…

.[[backup@waifu.club]].wis勒索病毒数据怎么处理|数据解密恢复

导言&#xff1a; 随着科技的不断发展&#xff0c;网络安全威胁也变得愈发严峻。最近&#xff0c;一种名为.[[backupwaifu.club]].wis的勒索病毒愈演愈烈&#xff0c;给用户的数据安全带来了极大的威胁。本文将深入介绍.[[backupwaifu.club]].wis病毒的特征、如何应对数据加密…

帆软的控件参数-笔记1

1.帆软的控件参数 变量可以通过模板->模板参数定义添加需要给变量赋值的控件&#xff0c;如下拉控件时&#xff0c;将控件名称命名为与模板参数同名帆软就会自行匹配。也可以不添加模板参数&#xff0c;直接给控件名称命名&#xff0c;该命名就是变量名&#xff0c;该变量名…

Vmware17虚拟机安装windows10系统

不要去什么系统之家之类的下载镜像&#xff0c;会不好安装&#xff0c;镜像被魔改过了&#xff0c;适合真实物理机上的系统在PE里安装系统&#xff0c;建议下载原版系统ISO文件 安装vmware17pro 下载地址https://dwangshuo.jb51.net/202211/tools/VMwareplayer17_855676.rar 解…

pandas基础1

​ Pandas 是非常著名的开源数据处理库&#xff0c;我们可以通过它完成对数据集进行快速读取、转换、过滤、分析等一系列操作。除此之外&#xff0c;Pandas 拥有强大的缺失数据处理与数据透视功能&#xff0c;可谓是数据预处理中的必备利器。 ​ Pandas 是非常著名的开源数据处…

Vue3中定义变量是选择ref还是reactive?

Ref 与reactive 在 Vue 3 中&#xff0c;reactive 和 ref 是用于创建响应式数据的两个不同的 API。它们都是 Vue 3 Composition API 的一部分。 ref&#xff1a; ref 用于创建一个包装基本数据类型的响应式对象。它接受一个初始值&#xff0c;并返回一个包含 value 属性的对…

Effective C++(一): Const Correctness, Const成员函数和Const Cast

文章目录 一、Const成员函数二、Const Correctness三、Const Cast 有关 const 的用法是 cpp 中一个非常经典且易错的部分&#xff0c;在面试和日常工作中各种各样的 const 经常让人摸不着头脑&#xff0c;今天就来根据 const 扮演的不同角色来归纳有关 const 的不同用法 一、C…

泊车功能专题介绍 ———— 汽车全景影像监测系统性能要求及试验方法(国标未公布)

文章目录 术语和定义一般要求功能要求故障指示 性能要求响应时间图像时延单视图视野范围平面拼接视图视野平面拼接效果总体要求行列畸变拼接错位及拼接无效区域 试验方法环境条件仪器和设备车辆条件系统响应时间试验图像时延试验单视图视野范围试验平面拼接视图视野试验平面拼接…

Ubuntu 22.04安装Go 1.21.4编译器

lsb_release -r看到操作系统版本是22.04,uname -r看到内核版本是uname -r。 sudo wget https://studygolang.com/dl/golang/go1.21.4.linux-amd64.tar.gz下载编译器。 sudo tar -zxf go1.21.4.linux-amd64.tar.gz -C /goroot将文件解压到/goroot目录下&#xff0c;这个命令…

生成带依赖Jar 包的两种常用方式:IDEA打包工具:Artifacts 和 maven-shade-plugin

文章目录 前言1、IDEA打包工具&#xff1a;Artifacts1.1 创建Artifacts1.2 选择第三方jar文件1.3 打包Artifacts1.4 测试jar包 2、maven-shade-plugin2.1、pom文件添加2.2、打包2.3、测试jar包 总结 前言 当我们编写完Java程序后&#xff0c;为了提高执行效率通常会将应用程序…

冒泡排序详解

1.引入 当我们创建一个数组时&#xff0c;我们可能会发现这个数组的元素顺序可能不固定&#xff0c;这个时候就需要我们给数组排序&#xff0c;给数组排序的方法有很多种&#xff0c;这里今天我们先来介绍一下最简单的一种排序方法&#xff0c;即冒泡排序。 冒泡排序顾名思义&a…

vscode配置c++环境

我现在觉得vscode确实很好用&#xff0c;所以python和c都是用的这个。 首先是安装vs&#xff1a; 官网寻找即可&#xff1a;https://code.visualstudio.com/ 安装好后需要装一些插件&#xff1a; 装上这两个插件&#xff0c;c/c&#xff0c;code runner 接着安装c编译器mi…

canvas基础:绘制虚线

canvas实例应用100 专栏提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。 canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重要的帮助。 文章目录 示例…

一些常见的爬虫库

一些常见的爬虫库&#xff0c;并按功能和用途进行分类&#xff1a; 通用爬虫库&#xff1a; Beautiful Soup&#xff1a;用于解析HTML和XML文档&#xff0c;方便地提取数据。Requests&#xff1a;用于HTTP请求&#xff0c;获取网页内容。Scrapy&#xff1a;一个强大的爬虫框架…

Python爬虫教程27:秀啊!用Pandas 也能爬虫??

说到爬虫&#xff0c;大家可能都知道requests、re、scrapy、selenium等等一些工具库。虽然它低调&#xff0c;但功能非常强大&#xff0c;用于抓取Table表格型数据时&#xff0c;简直是个神器&#xff0c;没有必要去F12研究HTML页面结构甚至写正则表达式解析字段。 #我的Pytho…

Python教程78:聊聊exec和eval()函数,有什么用法区别

exec 和 eval 是 Python 中的两个内置函数&#xff0c;它们都可以执行Python代码&#xff0c;但它们的使用方式和目的有所不同。 1.exec()函数用于执行动态的 Python 代码&#xff0c;你可以使用exec来执行存储在字符串或对象代码中的 Python 代码。exec 不会返回任何结果&…

BigDecimal

用于解决小数运算中&#xff0c;出现的不精确问题。 创建对象 new BigDecimal(double val)&#xff1a;不用&#xff0c;无法解决不精确问题。 new BigDecimal(String val)&#xff1a;推荐 BigDecimal.valueOf(double val)&#xff1a;推荐 常用方法 加法&#xff1a;add(Bi…

【嵌入式-51单片机】常见位运算和数据类型以及sbit使用

51单片机中 数据类型如下&#xff1a; 位运算符如下&#xff1a; 按位左移<<&#xff1a;低位补零&#xff0c;高位移出 按位右移>>&#xff1a;高位补零&#xff0c;低位移出 按位与&&#xff1a;对应位上的值必须同时为1才为1&#xff0c;可以用来对指定位…

【2023年修正版】哈夫曼编码详解

霍夫曼编码的原理就是根据字符的使用频率&#xff0c;排成二叉树&#xff0c;使用次数少的放到后面&#xff0c;使用次数多的离根节点越近&#xff1b;这样字符的占位也相应的较少。 首先&#xff0c;主要操作是找每次字符中使用频率最低的&#xff08;数最小&#xff09;两个数…