多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ## Redis管道技术概述 Redis是一种基于`客户端-服务端模型(C/S模型)`以及`请求/响应协议`的TCP服务。 这意味着通常情况下一个请求会遵循以下步骤: * 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。 * 服务端处理命令,并将结果返回给客户端。 这就是普通请求模型。 ![](https://user-gold-cdn.xitu.io/2019/4/16/16a24bbf4f2c4c6c?imageView2/0/w/1280/h/960/format/webp/ignore-error/1) 所谓RTT(Round-Trip Time),就是**往返时延**,在计算机网络中它是一个重要的性能指标,表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认),总共经历的时延。 一般认为,单向时延 = 传输时延t1 + 传播时延t2 + 排队时延t3 为了解决这个问题,Redis支持通过管道,来达到减少RTT的目的。 ![](https://user-gold-cdn.xitu.io/2019/4/16/16a24bbf4f3e6a15?imageView2/0/w/1280/h/960/format/webp/ignore-error/1) ## Redis管道测试 那么管道的性能究竟如何呢? 下面我们一起来验证一下。 首先,redis提供了`redis-benchmark`工具测试性能,我在自己的电脑上通过cmd打开命令行,不使用管道,进行了一百万次set和get操作,效果如下: ``` $ redis-benchmark -n 1000000 -t set,get -q SET: 81466.40 requests per second GET: 81732.73 requests per second ``` ![Bn4khq.png](https://s1.ax1x.com/2020/10/26/Bn4khq.png) 平均每秒处理8万多次操作请求。 通过`-P`命令使用管道,效果如下: ``` $ redis-benchmark -n 1000000 -t set,get -P 16 -q SET: 602409.63 requests per second GET: 720461.06 requests per second ``` 使用管道以后,set和get的速度变成了每秒将近60万次和72万次。 ## 使用管道技术的注意事项 当你要进行频繁的Redis请求的时候,为了达到最佳性能,降低RTT,你应该使用管道技术。 但如果通过管道发送了太多请求,也会造成Redis的CPU使用率过高。 下面是通过循环向Redis发送出队指令来监听队列的CUP使用情况: ![](https://user-gold-cdn.xitu.io/2019/4/16/16a24bbf53b498ae?imageView2/0/w/1280/h/960/format/webp/ignore-error/1) 当管道中累计了大量请求以后,CUP使用率迅速升到了100%,这是非常危险的操作。 对于监听队列的场景,一个简单的做法是当发现队列返回的内容为空的时候,就让线程休眠几秒钟,等队列中累积了一定量数据以后再通过管道去取,这样就既能享受管道带来的高性能,又避免了CPU使用率过高的风险。