主頁 > 知識(shí)庫 > Redis教程(十三):管線詳解

Redis教程(十三):管線詳解

熱門標(biāo)簽:鐵路電話系統(tǒng) 呼叫中心市場需求 百度競價(jià)排名 AI電銷 地方門戶網(wǎng)站 服務(wù)外包 網(wǎng)站排名優(yōu)化 Linux服務(wù)器

一、請(qǐng)求應(yīng)答協(xié)議和RTT:

    Redis是一種典型的基于C/S模型的TCP服務(wù)器。在客戶端與服務(wù)器的通訊過程中,通常都是客戶端率先發(fā)起請(qǐng)求,服務(wù)器在接收到請(qǐng)求后執(zhí)行相應(yīng)的任務(wù),最后再將獲取的數(shù)據(jù)或處理結(jié)果以應(yīng)答的方式發(fā)送給客戶端。在此過程中,客戶端都會(huì)以阻塞的方式等待服務(wù)器返回的結(jié)果。見如下命令序列:
   

復(fù)制代碼 代碼如下:

 Client: INCR X
    Server: 1
    Client: INCR X
    Server: 2
    Client: INCR X
    Server: 3
    Client: INCR X
    Server: 4
 

    在每一對(duì)請(qǐng)求與應(yīng)答的過程中,我們都不得不承受網(wǎng)絡(luò)傳輸所帶來的額外開銷。我們通常將這種開銷稱為RTT(Round Trip Time)?,F(xiàn)在我們假設(shè)每一次請(qǐng)求與應(yīng)答的RTT為250毫秒,而我們的服務(wù)器可以在一秒內(nèi)處理100k的數(shù)據(jù),可結(jié)果則是我們的服務(wù)器每秒至多處理4條請(qǐng)求。要想解決這一性能問題,我們?cè)撊绾芜M(jìn)行優(yōu)化呢?
   
二、管線(pipelining):

    Redis在很早的版本中就已經(jīng)提供了對(duì)命令管線的支持。在給出具體解釋之前,我們先將上面的同步應(yīng)答方式的例子改造為基于命令管線的異步應(yīng)答方式,這樣可以讓大家有一個(gè)更好的感性認(rèn)識(shí)。
 

復(fù)制代碼 代碼如下:

    Client: INCR X
    Client: INCR X
    Client: INCR X
    Client: INCR X
    Server: 1
    Server: 2
    Server: 3
    Server: 4
 

    從以上示例可以看出,客戶端在發(fā)送命令之后,不用立刻等待來自服務(wù)器的應(yīng)答,而是可以繼續(xù)發(fā)送后面的命令。在命令發(fā)送完畢后,再一次性的讀取之前所有命令的應(yīng)答。這樣便節(jié)省了同步方式中RTT的開銷。
    最后需要說明的是,如果Redis服務(wù)器發(fā)現(xiàn)客戶端的請(qǐng)求是基于管線的,那么服務(wù)器端在接受到請(qǐng)求并處理之后,會(huì)將每條命令的應(yīng)答數(shù)據(jù)存入隊(duì)列,之后再發(fā)送到客戶端。
   
三、Benchmark:

    以下是來自Redis官網(wǎng)的測試用例和測試結(jié)果。需要說明的是,該測試是基于loopback(127.0.0.1)的,因此RTT所占用的時(shí)間相對(duì)較少,如果是基于實(shí)際網(wǎng)絡(luò)接口,那么管線機(jī)制所帶來的性能提升就更為顯著了。

復(fù)制代碼 代碼如下:

require 'rubygems'
    require 'redis'
   
    def bench(descr)
        start = Time.now
        yield
        puts "#{descr} #{Time.now-start} seconds"
    end
   
    def without_pipelining
        r = Redis.new
        10000.times {
            r.ping
        }
    end
   
    def with_pipelining
        r = Redis.new
        r.pipelined {
            10000.times {
                r.ping
            }
        }
    end
   
    bench("without pipelining") {
        without_pipelining
    }
    bench("with pipelining") {
        with_pipelining
    }
    //without pipelining 1.185238 seconds
    //with pipelining 0.250783 seconds

您可能感興趣的文章:
  • Redis教程(十四):內(nèi)存優(yōu)化介紹
  • Redis教程(十五):C語言連接操作代碼實(shí)例
  • Redis的LRU機(jī)制介紹
  • Redis數(shù)據(jù)庫的應(yīng)用場景介紹
  • Redis的Python客戶端redis-py安裝使用說明文檔
  • Redis list 類型學(xué)習(xí)筆記與總結(jié)
  • Redis中實(shí)現(xiàn)查找某個(gè)值的范圍
  • Redis禁用命令、危險(xiǎn)命令及規(guī)避方法
  • 簡介Lua腳本與Redis數(shù)據(jù)庫的結(jié)合使用
  • 從MySQL到Redis的簡單數(shù)據(jù)庫遷移方法
  • 在Node.js應(yīng)用中讀寫Redis數(shù)據(jù)庫的簡單方法
  • Redis sort 排序命令詳解
  • 圖文介紹PHP添加Redis模塊及連接
  • 詳解Redis中的雙鏈表結(jié)構(gòu)
  • Redis中的動(dòng)態(tài)字符串學(xué)習(xí)教程
  • 利用Redis實(shí)現(xiàn)SQL伸縮的方法

標(biāo)簽:蘭州 銅川 湘潭 仙桃 衡水 黃山 湖南 崇左

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Redis教程(十三):管線詳解》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266