管道

  • 开始接触Redis时候,对应Redis管道有一个错误认识,任务是redis服务器提供的一种特别的技术,有了这种技术可以加速Redis的存取效率,但是实际上Redis的管道计算(Pipeline)本身是客户端提供的技术,与服务端无关。
Redis消息交互
  • 当我们使用客户端对Redis服务器发送消息指令,客户端将请求发送给服务器,服务器处理完后响应信息返回给客户端,需要花费一个网络数据报的来回时间。
  • 如果联系执行多条指令,会花费多个网络数据报的来回时间,如下图

  • 多条指令的时候,客户端经历了写–读--写–读四个操作完成整改两条指令。
  • 假如我们跳转顺序,编程:写–写--读–读,那么同样是两个指令是不是可以将写入信息打包发送,读取的信息打包返回,如下图:
  • 这便是Redis客户端管道操作的本质作用,服务器并没有区别对待,还是走一条消息,一次执行,回复一条消息的正常流程,客户端通过对管道列表改变读写顺序就可以大幅度节省IO时间。管道中指令越多越好。
深入理解管道工作流程
  • 上一节中有一个完整的Redis指令请求的流行,我们拿来,如下

  • 如上刘冲中我们逐步分析作用
  1. Client调用write将消息写入操作系统内核为套接字准备的发送缓冲区send buffer中
  2. Client操作系统内核将发送缓冲的内容发送到王卡NIC,王卡硬件将数据通过“网络路由”送的服务器的王卡NIC
  3. 服务器操作系统内核将王卡数据放到内核为套接字分配的接收缓冲recv buffer中
  4. 服务器进程调用read从接收缓冲中取出消息进行处理
  5. 服务器进程调用write将响应消息写道内核为套接字分配的发送缓冲send buffer中
  6. 服务器操作系统内核发送缓冲区中的内容到王卡,服务器网卡将数据通过“网络路由”送到客户端的网卡
  7. 客户端操作系统内核将网卡中数据写道内核为套接字分配的接收缓冲区 recv buffer中
  8. 客户端进程调用read从接收缓冲区中取出消息并返回给上层业务逻辑进行处理
  • 以上是所有步骤,其中5 ~ 8 和 1 ~ 4 是一样的,只不过方向反过来,一个请求一个响应

  • 我们从上面步骤看出

    • 服务器的write操作不需要等对方收到消息才返回,他实际上只负责将数据写入到本地操作系统内核的发送缓冲区中,生效的由操作系统自己将数据发送到客户端机器,如果缓冲区满那么需要等待缓冲区空闲,这个才是写操作IO的耗时
    • 客户端的read操作并不是从服务器直接拉去数据,他实际上只负责将数据从本地操作系统的内核的接收缓冲区取出数据,如果缓存区是空的,那么需要等待数据到来,这个才是read操作IO的实际时间
  • 案例,value = RedisDao.get(key)

    • 客户端将指令写入缓冲区,返回,几乎无消耗
    • 客户端read需要等待消息经过网络路由到目标机器处理后的响应消息,在回送到当前的内核读缓冲才可以返回,这个是网络的真正开销
  • 如上案例也可以看出,对于管道来说,连续的write操作根本没有耗时,之后第一个read操作会等待一个网络来回的的开销,然后后续所有响应消息也会打包一起回到内核的读缓冲区,效率大增

上一篇:Redis高效性探索–线程IO模型,通信协议
下一篇:Redis持久化-深入理解AOF,RDB

Redis高效性探索--管道相关推荐

  1. Redis高效性探索--线程IO模型,通信协议

    Redis线程IO模型 Redis是单线程,这个毋庸置疑 Redis单线程能做到这么高的效率?不用怀疑,还有很多其他的服务都是单线程但是也有超高的效率,比如Node.js,Nginx也是单线程. Re ...

  2. 窥探Windows UUP 正向差分更新机制的高效性

    窥探Windows UUP 正向差分更新机制的高效性 概述 Express 更新 Windows 10 正向/逆向差分机制 Windows UUP 正向差分机制 双向delta的探索 单一正向差分 解 ...

  3. FAN(Understanding The Robustness in Vision Transformers)论文解读,鲁棒性和高效性超越ConvNeXt、Swin

    FAN(Understanding The Robustness in Vision Transformers)论文解读,鲁棒性和高效性超越ConvNeXt.Swin < center > ...

  4. 用于分子生成的数据高效性图语法学习

    近年来分子生成问题收到了很多关注.但是现有的方法都是基于深度神经网络,需要在很大的数据集上训练.在实践中,由于劳动密集型实验和数据收集,特定类别化学数据集的规模通常是有限的(例如,几十个样本).这对深 ...

  5. 利用Apply的参数数组化来提高代码的优雅性,及高效性

    利用Apply的参数数组化来提高代码的优雅性,及高效性 Function.apply()在提升程序性能方面的技巧 我们先从Math.max()函数说起,Math.max后面可以接任意个参数,最后返回所 ...

  6. 二维码防伪系统开发-实现了产品信息防伪的高效性

    一.系统介绍 二维码防伪采用二维码加密技术给产品做标识,将二维码印刷或标贴于产品包装上,用户只需通过指定的二维码防伪系统或手机软件进行解码检验,即可验证产品真伪,获得详尽的信息.二维码可储存丰富的产品 ...

  7. muduo源码剖析——以三个切片浅析muduo库代码设计的严谨性、高效性与灵活性

    0 前言 陈硕大佬的muduo网络库的源码我已经看了好久了,奈何本人实力有限,每每看到其代码设计的精巧之处只能内心称赞,无法用言语表达出来.实在令人汗颜.最近在看到网络设计部分时有了一些体会,结合自己 ...

  8. 分布式缓存Redis之Pipeline(管道)

    Pipeline,你土味一点你把它翻译成一条龙服务 专业一点,叫它综合解决方案,就行. 算法或者大数据分析里的 可重复使用,针对新的数据,直接输入数据,可以得到结果. 一个典型的机器学习构建包含若干个 ...

  9. Redis之Pipeline(管道)

    1.Pipeline定义 管道(pipeline)可以一次性发送多条命令并在执行完后一次性将结果返回,pipeline 通过减少客户端与 redis 的通信次数来实现降低往返延时时间,而且 Pipel ...

最新文章

  1. 宅男抖音某猫协议分析及应用破解
  2. React onClick 传递参数
  3. 【独家】玩流量,先读懂数据再说吧!PM玩转流量课程笔记大放送
  4. Terraform入门 - 4. destroy 基础设施
  5. Java 读取 .properties 配置文件的几种方式
  6. 关于USB-AUDIO使用ALSA编程的一点问题
  7. 基于matlab的回波,基于MATLAB回波信号产生与消除.doc
  8. 北大OJ(POJ 3237)鸡兔同笼
  9. WORD如何缩小编号与文本之间的距离?
  10. 计算机基础与应用32页,《计算机基础与应用》2次作业及答案
  11. Neutron FWaaS 原理
  12. java nextprime_中国MOOC_零基础学Java语言_第7周 函数_1分解质因数
  13. 一个简化的分布式系统架构图
  14. c语言setlocale函数,setlocale函数
  15. Kotlin中val和var的区别
  16. 配电房环境智能监测系统及轨道巡检机器人
  17. Acoustics | 声音时间检测:日常声音理解
  18. Vue音乐--排行榜页面02_抓取首页数据
  19. Ubuntu18.04.1在图形用户界面下移动和复制文件时权限不够问题的解决
  20. 物联网开发笔记(24)- 使用Micropython开发ESP32开发板之控制8x8点阵屏

热门文章

  1. Android之通过adb shell getprop、netstat命令看dns、ip
  2. 浅谈C++类(7)--析构函数
  3. 负基础学python编程_【数据科学系统学习】Python # 编程基础[二]
  4. mysql申请审核系统_Mysql审核工具archery
  5. node中间件mysql_nodejs 中使用mysql数据有没有类似 mongoose 的中间件?
  6. c语言将十进制转化为二进制算法_base64算法初探即逆向分析
  7. 从行驶的车上向上抛球,球真的会回到原地吗?
  8. 做生意最重要的诚信呢??? | 今日最佳
  9. 考试必错规则:如果你觉得题目很简单,代表你肯定错了
  10. 【赠书活动】优雅免费领书指南