天天看點

Redis筆記(二)之Pipelineredis版本Pipeline的作用

文章目錄

  • redis版本
  • Pipeline的作用
    • 指令行操作
    • 測試

redis版本

  1. redis版本:3.2.11

Pipeline的作用

  1. redis提供了批量指令,比如mget、mset等,有效的節約RTT(Round Trip Time)。但是大部分指令不支援批量操作。對于沒有批量操作的指令,使用pipeline可以減少RTT,即一次網絡請求可以執行多次指令,整個過程隻需要1次RTT。Redis執行指令的時間大約在微秒級别,是以性能瓶頸一般在用戶端與服務端之間的網絡延遲上,而pipeline可以減少網絡之間的互動次數,減少在網絡上傳輸的時間。
    Redis筆記(二)之Pipelineredis版本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
               

繼續閱讀