Redis笔记(二)之Pipeline

redis版本

  1. redis版本:3.2.11

Pipeline的作用

  1. redis提供了批量命令,比如mget、mset等,有效的节约RTT(Round Trip Time)。但是大部分命令不支持批量操作。对于没有批量操作的命令,使用pipeline可以减少RTT,即一次网络请求可以执行多次命令,整个过程只需要1次RTT。Redis执行命令的时间大约在微秒级别,所以性能瓶颈一般在客户端与服务端之间的网络延迟上,而pipeline可以减少网络之间的交互次数,减少在网络上传输的时间。

  2. Pipeline不是redis服务端提供的技术,本质上是由客户端提供的,客户端将多个命令打包在一起,一次性发送,而不需要等待每个单独命令的执行结果,而服务器在执行完所有命令后将所有结果一次性返回。虽然可以使用Pipeline模拟出原生批量命令的效果,但是它与redis本身的批量命令还是有很大区别的

    • 原生批量命令是原子的,Pipeline是非原子的
    • 原生批量命令是一个命令对应多个key,Pipeline是多个命令
    • 原生批量命令是Redis服务端本身支持的,Pipeline是客户端与服务端共同实现的
  3. Pipeline的本质就是写合并和读合并,客户端将所有的write一次写入缓冲区,写入缓冲区成功就立即放回。客户端读取服务端响应,第一次读会等待服务端网络返回延迟的时间,一旦服务端返回,此时所有请求命令的响应已经都返回到客户端,所以后续的读就是直接读取缓冲区,从中拿到响应的结果,没有网络开销。

  4. Pipeline组装的命令不能太多,如果一次组装的数据量太大,客户端的等待时间会变长,还有可能导致网络阻塞,可以将一次包含大量命令的Pipeline拆分成几次来执行

命令行操作

  1. 命令行客户端发送管道命令

        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
    

测试

  1. 使用redis自带的压力测试redis-benchmark比较一下使用和不使用Pipeline的差异

  2. 普通的set命令,QPS大约11w/s左右

        # redis-benchmark -t set -q 
        SET: 111856.82 requests per second
    
  3. 使用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
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值