Redis教程(十三):管線詳解
一、請求應(yīng)答協(xié)議和RTT:
Redis是一種典型的基于C/S模型的TCP服務(wù)器。在客戶端與服務(wù)器的通訊過程中,通常都是客戶端率先發(fā)起請求,服務(wù)器在接收到請求后執(zhí)行相應(yīng)的任務(wù),最后再將獲取的數(shù)據(jù)或處理結(jié)果以應(yīng)答的方式發(fā)送給客戶端。在此過程中,客戶端都會以阻塞的方式等待服務(wù)器返回的結(jié)果。見如下命令序列:
Client: INCR X
Server: 1
Client: INCR X
Server: 2
Client: INCR X
Server: 3
Client: INCR X
Server: 4
在每一對請求與應(yīng)答的過程中,我們都不得不承受網(wǎng)絡(luò)傳輸所帶來的額外開銷。我們通常將這種開銷稱為RTT(Round Trip Time)?,F(xiàn)在我們假設(shè)每一次請求與應(yīng)答的RTT為250毫秒,而我們的服務(wù)器可以在一秒內(nèi)處理100k的數(shù)據(jù),可結(jié)果則是我們的服務(wù)器每秒至多處理4條請求。要想解決這一性能問題,我們該如何進行優(yōu)化呢?
二、管線(pipelining):
Redis在很早的版本中就已經(jīng)提供了對命令管線的支持。在給出具體解釋之前,我們先將上面的同步應(yīng)答方式的例子改造為基于命令管線的異步應(yīng)答方式,這樣可以讓大家有一個更好的感性認識。
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)客戶端的請求是基于管線的,那么服務(wù)器端在接受到請求并處理之后,會將每條命令的應(yīng)答數(shù)據(jù)存入隊列,之后再發(fā)送到客戶端。
三、Benchmark:
以下是來自Redis官網(wǎng)的測試用例和測試結(jié)果。需要說明的是,該測試是基于loopback(127.0.0.1)的,因此RTT所占用的時間相對較少,如果是基于實際網(wǎng)絡(luò)接口,那么管線機制所帶來的性能提升就更為顯著了。
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語言連接操作代碼實例
- Redis的LRU機制介紹
- Redis數(shù)據(jù)庫的應(yīng)用場景介紹
- Redis的Python客戶端redis-py安裝使用說明文檔
- Redis list 類型學(xué)習(xí)筆記與總結(jié)
- Redis中實現(xiàn)查找某個值的范圍
- Redis禁用命令、危險命令及規(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中的動態(tài)字符串學(xué)習(xí)教程
- 利用Redis實現(xiàn)SQL伸縮的方法
相關(guān)文章
Linux下安裝Redis并設(shè)置相關(guān)服務(wù)
這篇文章主要為大家介紹了Linux下安裝Redis并設(shè)置相關(guān)服務(wù),感興趣的小伙伴們可以參考一下2016-01-01
從零搭建SpringBoot2.X整合Redis框架的詳細教程
這篇文章主要介紹了從零搭建SpringBoot2.X整合Redis框架的詳細教程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
Redis數(shù)據(jù)遷移RedisShake的實現(xiàn)方法
本文主要介紹了Redis數(shù)據(jù)遷移RedisShake的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04
淺談Redis在分布式系統(tǒng)中的協(xié)調(diào)性運用
這篇文章主要介紹了Redis在分布式系統(tǒng)中的協(xié)調(diào)性運用,講解了Redis在進程和線程的調(diào)度上以及消息隊列中的作用,需要的朋友可以參考下2016-03-03
Redis遍歷所有key的兩個命令(KEYS 和 SCAN)
這篇文章主要介紹了Redis遍歷所有key的兩個命令(KEYS 和 SCAN),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04

