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