redis之管道——pipeline
阿新 • • 發佈:2019-04-26
comm quest sock 等待 結果 短信 nbsp 通過 命令執行 。
redis 是 CS 模式,Redis客戶端與Redis之間使用TCP協議進行連接,一個客戶端可以通過一個socket連接發起多個請求命令,每個請求命令發出後client通常會阻塞並等待redis服務處理,redis處理完後請求命令後會將結果通過響應報文返回給client,因此當執行多條命令的時候都需要等待上一條命令執行完畢才能執行。如果一次性批量數據單次操作,會有網絡延遲。而redis也是單線程的。
而Pipelining可以滿足批量的操作,把多個命令連續的發送給Redis Server,然後一一解析響應結果。Pipelining可以提高批量處理性能,提升的原因主要是TCP連接中減少了“交互往返”的時間
具體實現:
Pipeline pipeline =jedis.pipelined();
// 循環添加 1000個元素
for(int i = 0; i < 1000; i++){
pipeline.rpush("rediskey", i + "");
}
//執行
pipeline.sync()
Pipeline
操作:request request request — — — — — response response response
單次操作:request —response request —response request —response
對於 pipeline
是不能有其它操作,結果也不能一下返回,需要等批量操作結果全部一起返回。有些系統可能對可靠性要求很高,每次操作都需要立馬知道這次操作是否成功,是否數據已經寫進redis了,那這種場景就不適合操作。
對於批量將數據寫入redis,允許一定比例的寫入失敗,那麽這種場景就可以使用了,比如10萬條一下進入redis,可能失敗了幾條無所謂,後期有補償機制就行了,比如短信群發這種場景,如果一下群發10萬條,按照第一種模式去實現,那這個請求過來,要很久才能給客戶端響應,這個延遲就太長了,如果客戶端請求設置了超時時間5秒,那肯定就拋出異常了,而且本身群發短信要求實時性也沒那麽高,這時候用pipeline最好了。
pipeline 底層是通過把所有的操作封裝成流,redis有定義自己的出入輸出流。在 sync() 方法執行操作,每次請求放在隊列裏面,解析響應包。
redis之管道——pipeline