Redis批量執行(如list批量添加)命令工具 —— pipeline管道應用

前言

  1. Redis使用的是客戶端-服務器(CS)模型和請求/響應協議的TCP服務器。這意味着通常情況下一個請求會遵循以下步驟:

    (1)客戶端向服務端發送一個查詢請求,並監聽Socket返回,通常是以阻塞模式,等待服務端響應。
    (2)服務端處理命令,並將結果返回給客戶端。
  2. 客戶端和服務端通過網絡進行連接。這樣的連接可能非常快(在一個迴路網絡中),也可能非常慢(在廣域網上經過多個結點才能互通的兩個主機)。
  3. 但是無論是否存在網絡延遲,數據包從客戶端傳輸到服務端,以及客戶端從服務端獲得響應都需要花費一些時間。這段時間就稱爲往返時延(Round Trip Time)。
  4. 因此當客戶端需要執行一串請求的時候,很容易看出它對性能的影響(例如往同一個隊列中加入大量元素,或者往數據庫中插入大量的鍵)。如果RTT時長爲250毫秒(在基於廣域網的低速連接環境下),即使服務器每秒可以處理10萬個請求,但是實際上我們依然只能每秒處理最多4個請求。
  5. 如果處於一個迴路網絡中,RTT時長則相當短(我的主機ping 127.0.0.1時只需要0.063ms),但是如果你執行一大串寫入請求的時候,還是會有點長。
  6. 如果需要一次執行多個redis命令,以往的方式需要發送多次命令請求,由redis服務器依次執行,並返回結果。
  7. 爲了解決此類問題,設計者設計出了redis管道命令:客戶端可以向服務器發送多個請求,而不必等待回覆,並最終在一個步驟中讀取回復返回給客戶端,從而大大增加了協議性能。

pipeline在php中的應用

  1. 管道的開啓方式最主要是一條命令:$redis->pipeline()
  2. 批量給一個list類型的key添加10w條數據,實例如下:

    <?php
       $redis = new Redis();
       $redis->connect('127.0.0.1', 6379);
       $redis->auth('******');
       $redis->select(0);
       $redis->pipeline();//開啓管道
       
       //假設變量$data數組有10w條數據,批量添加到list類型中
       $data = array(1,2,3,...,100000);
       $key = 'list1';
       foreach($data as $value){
           $redis->rpush($key,$value);
       }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章