redis版本
- redis版本:3.2.11
Pipeline的作用
-
redis提供了批量命令,比如mget、mset等,有效的节约RTT(Round Trip Time)。但是大部分命令不支持批量操作。对于没有批量操作的命令,使用pipeline可以减少RTT,即一次网络请求可以执行多次命令,整个过程只需要1次RTT。Redis执行命令的时间大约在微秒级别,所以性能瓶颈一般在客户端与服务端之间的网络延迟上,而pipeline可以减少网络之间的交互次数,减少在网络上传输的时间。
-
Pipeline不是redis服务端提供的技术,本质上是由客户端提供的,客户端将多个命令打包在一起,一次性发送,而不需要等待每个单独命令的执行结果,而服务器在执行完所有命令后将所有结果一次性返回。虽然可以使用Pipeline模拟出原生批量命令的效果,但是它与redis本身的批量命令还是有很大区别的
- 原生批量命令是原子的,Pipeline是非原子的
- 原生批量命令是一个命令对应多个key,Pipeline是多个命令
- 原生批量命令是Redis服务端本身支持的,Pipeline是客户端与服务端共同实现的
-
Pipeline的本质就是写合并和读合并,客户端将所有的write一次写入缓冲区,写入缓冲区成功就立即放回。客户端读取服务端响应,第一次读会等待服务端网络返回延迟的时间,一旦服务端返回,此时所有请求命令的响应已经都返回到客户端,所以后续的读就是直接读取缓冲区,从中拿到响应的结果,没有网络开销。
-
Pipeline组装的命令不能太多,如果一次组装的数据量太大,客户端的等待时间会变长,还有可能导致网络阻塞,可以将一次包含大量命令的Pipeline拆分成几次来执行
命令行操作
-
命令行客户端发送管道命令
1. 数据准备 $ cat pipeline.txt set age 10 sadd num 12 13 2. 文本中的每一行必须\r\n结尾,使用unix2dos $ unix2dos pipeline.txt unix2dos: converting file pipeline.txt to DOS format ... 3. redis-cli加上--pipe选项,通过管道发送命令 $ cat pipeline.txt | /usr/local/redis-3.2.11/src/redis-cli --pipe All data transferred. Waiting for the last reply... Last reply received from server. errors: 0, replies: 2
测试
-
使用redis自带的压力测试
redis-benchmark
比较一下使用和不使用Pipeline的差异 -
普通的set命令,QPS大约11w/s左右
# redis-benchmark -t set -q SET: 111856.82 requests per second
-
使用Pipeline,需要加上选项P,表示单个管道内并行的请求数量,P=2是QPS大约19w/s,P=3时QPS大约32w/s,P=7时基本达到上限,再提升P参数已经无法提高QPS。因为这里CPU处理能力已经达到瓶颈,Redis单线程CPU消耗已经达到极限。
# redis-benchmark -t set -P 2 -q SET: 198019.80 requests per second # redis-benchmark -t set -P 3 -q SET: 323624.62 requests per second # redis-benchmark -t set -P 4 -q SET: 406504.06 requests per second # redis-benchmark -t set -P 5 -q SET: 393700.78 requests per second # redis-benchmark -t set -P 6 -q SET: 478468.88 requests per second # redis-benchmark -t set -P 7 -q SET: 645161.31 requests per second # redis-benchmark -t set -P 8 -q SET: 625000.00 requests per second # redis-benchmark -t set -P 9 -q SET: 540540.56 requests per second # redis-benchmark -t set -P 8 ====== ? ====== 100000 requests completed in 0.16 seconds 50 parallel clients 3 bytes payload keep alive: 1 97.70% <= 1 milliseconds 100.00% <= 1 milliseconds 621118.00 requests per second