HI !我是小小,我们来到了这期-深入探讨Redis管道。

Redis消息交互

当我们使用客户端对Redis进行一次操作时,客户端会把请求传送给服务器,服务器处理完成以后,再把响应恢复给客户端,这要花费一个网络数据包的来回时间。如果要连续执行多条指令,那就会花费多个网络数据包来回的时间,如图所示回到客户端代码里,客户端经历了写-读-写-读四个操作完整的执行了两条指令。

writer  ->  read   ->  write  -> read

现在如果我们调整读写顺序,改成写 - 写 - 读 - 读 这两个指令同样可以正常完成。如图所示

write ->  write  -> read  -> read

两个连续的写操作和两个联系的读操作总共只会花费一次网络来回,就好像连续的写操作合并了,连续的读操作也合并了、如图所示这便是管道的本质,服务器根本没有任何区别对待,还是走着收到一条消息,执行一条消息,回复一条消息的正常流程,客户端通过对管道中的指令列表改变读写顺序就可以大幅的节省IO时间,管道中的指令越多,效果越好。

管道压力测试

Redis自带了一个压力测试工具,redis-benchmark使用这个工具,可以对管道进行测试。首先对一个set指令进行压力测试

> redis-benchmark -t set -q
set 51975.05 requests per second

这次加上-p 参数,表示单个管道内的并行的请求数量,如下所示,当 p = 2 时,QPS达到了 9w/s

> redis-benchmark -t set - P 2 -q
SET: 91240.88 requests per second

此时如果继续提升p参数,会发现已经提升不起来了。原因:因为在这里,CPU参数已经达到了瓶颈,Redis单线程CPU消耗已经达到了100%,无法继续飙升了。

深入理解管道本质

如图所示,是一个完整的交互流程图用文字描述一段流程

  1. 客户端进程调用write 把消息写到操作系统内核为套接字分配的发送缓冲send buffer 中

  2. 客户端操作系统内核把发送缓冲的内容发送到网卡,网卡硬件把数据通过网际路由送到服务器的网卡。

  3. 服务器操作系统内核把网卡的数据放到内核为套接字分配的接受缓冲recvbuffer 中。

  4. 服务器进程调用read从接收缓冲中取出消息进行处理。

  5. 服务器进程调用write把响应消息写入到内核为套接字分配的发送缓冲send buffer中。

  6. 服务器操作系统内核把要发送的缓冲的内容发送到网卡,网卡硬件把数据通过网际路由送到客户端的网卡。

  7. 客户端操作系统内核把万科数据放入到内核,为套接字分配的接收缓冲recvbuffer中。

  8. 客户端进程调用read从接收缓冲中取出消息返回给上层业务逻辑处理。

  9. 结束。

个人介绍

我是小小,一个生于二线,活在一线的佛系程序猿,运营一个公众号,小明菜市场,你若不在,我将永远都在,我在人间彷徨着,寻找着未来,我就是我,我是小小,我们下期再见。

小明菜市场

推荐阅读

● 必备收藏 | 超详细揭秘 Redis 持久化,建议收藏!

● 打卡学习 | Redis原理应用-线程IO模型

● 教程 | MySql都会了,确定不学习一下MyCat分片?

● 教程 | Hadoop集群搭建和简单应用

● 文末送书 | WAF 那些事

给我个好看再走好吗?

探讨 | 深入探讨Redis管道相关推荐

  1. Redis 管道技术

    Redis 管道技术 Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务.这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以 ...

  2. php redis 管道技术,Redis管道技术这么厉害,你都用对了吗

    Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务.这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响 ...

  3. 雷林鹏分享:Redis 管道技术

    Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务.这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响 ...

  4. PHP中Redis管道

    Redis是一个TCP服务器,支持请求/响应协议. 在Redis中,请求通过以下步骤完成: 客户端向服务器发送查询,并从套接字读取,通常以阻塞的方式,用于服务器响应. 服务器处理命令并将响应发送回客户 ...

  5. Redis管道(Pipeline)详解

    在讲解管道前,我们首先来了解一下redis的交互,redis的一次交互是由客户端发起,由服务端接收,那么我们连续操作一些指令,如下图所示: 客户端请求一个指令到服务器到服务器返回数据这个过程非常复杂, ...

  6. Redis管道技术的使用

    目录 Redis 管道技术 SpringDataRedis 使用管道 Redis 管道的性能测试 使用管道技术的注意事项 代码示例 Redis 管道技术 Redis是一种基于客户端-服务端模型(C/S ...

  7. Redis管道Pipelining原理详解

    请求/响应协议和RTT Redis是一种基于客户端-服务端模型及请求/响应协议的TCP服务. 这意味着一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听Socket返回,通常以阻塞模式, ...

  8. php redis管道,php redis pipeline怎么用 - 翟码农技术博客

    网上一大堆文章都在说pipeline怎么提升性能,我只是想知道安装好phpredis库之后,代码上如何写来开启管道模式,也就是下面这一小撮代码而已.$pipe = $redis->multi(R ...

  9. Redis管道 发布订阅

    管道(pipe): redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令. ...

最新文章

  1. BZOJ5324 洛谷4563 LOJ2545:[JXOI2018]守卫——题解
  2. Hadoop五个进程的作用和联系
  3. python3中的dict循环性能对比
  4. 572. Subtree of Another Tree
  5. Kafka消息序列化和反序列化(上)
  6. php 取数组数量_PHP array_slice():截取数组的一部分
  7. linux系统启动故障排除
  8. Redis常见面试题6 -- 持久化方式之AOF以及混合模式
  9. 吃下这枚安利!翠贝卡电影节上这五部VR视频不容错过
  10. sshpass远程执行脚本_终端-Linux命令之非交互SSH密码验证-Sshpass
  11. 面对 MySQL 查询索引失效,程序员的六大优化技巧!
  12. IOS学习之UITableView滚动到指定位置
  13. Disunity_V0.5.0 提取Unity生成的Apk的资源
  14. vr课设《梵高世界》第一人称的解谜游戏
  15. 文献html阅读器,强烈推荐文献阅读器CAJviewer——大学生阅读文献、论文必备工具!!!...
  16. 目标检测跟踪算法综述
  17. 显卡内存足够但是torch报错RuntimeError: CUDA out of memory
  18. 达内2016前端开发知识点总结--HTML5--8天
  19. 【Lesson 5】 和弦转位
  20. 老式计算机组装教程,旧机械硬盘可以装新电脑上吗?台式电脑加新/旧机械硬盘+分区教程...

热门文章

  1. 如何创建自己的composer包
  2. 关于在vue中结合数组方法的this的指向问题
  3. 如何在没有tomcat情况下直接连接JMX监控JVM
  4. Ajax Step By Step1
  5. tensorflow3
  6. [开心学php100天]第五天:string函数(上)
  7. 服务端解决跨域问题的方案(一)
  8. 操作系统(15)-Linux的用户权限
  9. spring-boot使用教程(一):让程序跑起来
  10. android自定义底部中间突出导航栏,Android选中突出背景效果的底部导航栏功能