五 redis學習筆記之pipeline

2021-06-19 07:58:56 字數 1795 閱讀 1390

五 redis學習筆記之pipeline

redis是乙個cs模式的tcp server,使用和http類似的請求響應協議。乙個client可以通過乙個socket連線發起多個請求命令。每個請求命令發出後client通常 會阻塞並等待redis服務處理,redis處理完後請求命令後會將結果通過響應報文返回給client。基本的通訊過程如下

client: incr x

server: 1

client: incr x

server: 2

client: incr x

server: 3

client: incr x

server: 4

基 本上四個命令需要8個tcp報文才能完成。由於通訊會有網路延遲,假如從client和server之間的包傳輸時間需要0.125秒。那麼上面的四個命 令8個報文至少會需要1秒才能完成。這樣即使redis每秒能處理100個命令,而我們的client也只能一秒鐘發出四個命令。這顯示沒有充分利用 redis的處理能力。除了可以利用mget,mset 之類的單條命令處理多個key的命令外

我們還可以利用pipeline的方式從client打包多條命令一起發出,不需要等待單條命令的響應返回,而redis服務端會處理完多條命令後會將多條命令的處理結果打包到一起返回給客戶端。通訊過程如下

client: incr x

client: incr x

client: incr x

client: incr x

server: 1

server: 2

server: 3

server: 4

假 設不會因為tcp 報文過長而被拆分。可能兩個tcp報文就能完成四條命令,client可以將四個incr命令放到乙個tcp報文一起傳送,server則可以將四條命令 的處理結果放到乙個tcp報文返回。通過pipeline方式當有大批量的操作時候。我們可以節省很多原來浪費在網路延遲的時間。需要注意到是用 pipeline方式打包命令傳送,redis必須在處理完所有命令前先快取起所有命令的處理結果。打包的命令越多,快取消耗記憶體也越多。所以並是不是打 包的命令越多越好。具體多少合適需要根據具體情況測試。下面是個jredis客戶端使用pipeline的測試

package jredisstudy;

import org.jredis.jredis;

import org.jredis.connector.connectionspec;

import org.jredis.ri.alphazero.jredisclient;

import org.jredis.ri.alphazero.jredispipelineservice;

import org.jredis.ri.alphazero.connection.defaultconnectionspec;

public class pipelinetest

private static void withoutpipeline()

jredis.quit();

} catch (exception e) }

private static void usepipeline()

jredis.quit();

} catch (exception e) }}輸出

103408 //使用了pipeline

104598 //沒有使用

測試結果不是很明顯,這應該是跟我的測試環境有關。我是在自己win連線虛擬機器的linux。網路延遲比較小。所以pipeline

優勢不明顯。如果網路延遲小的話,最好還是不用pipeline。除了增加複雜外,帶來的效能提公升不明顯。

Redis學習筆記(五) BitMap

就是通過乙個bit位來表示某個元素對應的值或者狀態,其中的key就是對應元素本身。我們知道8個bit可以組成乙個byte,所以bitmap本身會極大的節省儲存空間。redis從2.2.0版本開始新增了setbit,getbit,bitcount等幾個bitmap相關命令。雖然是新命令,但是並沒有新增...

Linux學習筆記 管道PIPE

管道 當從乙個程序連線資料流到另乙個程序時,使用術語管道 pipe include int pipe int filedes 2 建立管道 pipe 說明 返回值 0成功,1出錯。如果呼叫成功,則程序此時由了兩個額外的開啟檔案描述符,filedes 0 中的值是管道的讀取端,而filedes 1 是...

Linux學習筆記 管道PIPE

管道 當從乙個程序連線資料流到另乙個程序時,使用術語管道 pipe include int pipe int filedes 2 建立管道 pipe 說明 返回值 0成功,1出錯。如果呼叫成功,則程序此時由了兩個額外的開啟檔案描述符,filedes 0 中的值是管道的讀取端,而filedes 1 是...