字如其名,pipeline就是管道的意思臊恋。管道本身是能夠承載流式數(shù)據(jù)的一個長鏈路衣洁,所以通過管道的字面意思我們能夠知道他能夠進行事件的緩沖的。
redis客戶端與服務器端的交互
Redis其實是一個基于TCP協(xié)議的CS架構的內存數(shù)據(jù)庫捞镰。所有的操作都是一個request一個response的同步操作闸与。redis每接收到一個命令就會處理一個命令,并同步返回結果岸售。這樣帶來的問題就是践樱,一個命令就會產生一次RTT(Round Time Trip),這樣的話必然會消耗大量的網(wǎng)絡IO凸丸。
pipeline的出現(xiàn)
為了提高redis的讀寫能力拷邢,所以就有了pipeline的出現(xiàn),我們對于多個命令執(zhí)行屎慢,不再同步等待每個命令的返回結果瞭稼。我們會在統(tǒng)一一個時間點來獲取response。這樣就解決多個RTT的問題
普通請求模型:
Pipeline請求模型:
注:圖片來源,侵刪
當然腻惠,通過pipeline我們也不僅僅只是通過減少RTT來提高服務的響應能力环肘,對于redis來說,處理單次redis command所帶來的訪問數(shù)據(jù)結果操作和響應客戶端操作是沒有多少耗費的集灌,但是處理多次redis command除了帶來了頻繁的網(wǎng)絡io悔雹,同樣需要redis調用多次read() 和write()系統(tǒng)方法,系統(tǒng)方法會將數(shù)據(jù)從用戶態(tài)轉移到內核態(tài),這樣就會對進程上下文有比較大的影響了腌零。
通過pipeline我們將會大大減少這樣的操作梯找。
參考文章
pipeline注意點
- pipeline只適用于那些不需要獲取同步結果的場景,比如hincr益涧,hset等更新操作锈锤。而對于讀取hget操作則不能適用。
- pipeline組裝命令也不能是沒有節(jié)制的闲询,如果pipeline組裝命令數(shù)據(jù)過多久免,則會導致一次pipeline同步等待時間過長,影響客戶端體驗甚至導致網(wǎng)絡阻塞嘹裂。
- pipeline不能保證命令執(zhí)行的原子性妄壶。如多個命令在執(zhí)行的中間發(fā)生了異常,那么將會丟失未執(zhí)行的命令寄狼。所以我們一般使用pipeline時丁寄,需要自己保證執(zhí)行命令的數(shù)據(jù)安全性。