Redis命令執行的過程
關於Redis服務如何處理每條指令已經有相關文章了,可以移步去看,這裏只討論命令發送之後的流程:
- 客戶端進程調用write操作將數據寫到本地操作系統內核的發送緩衝中
- 客戶端操作系統內核異步將數據發送到服務端機器
- Redis服務端將數據從本地操作系統內核的接收緩衝中取出
- 執行Redis命令
- 服務端進程調用write操作將數據寫到本地操作系統內核的發送緩衝中
- 服務端操作系統內核異步將數據發送到客戶端機器
- 客戶端將數據從本地操作系統內核的接收緩衝中取出
上面過程中會有2個耗時點:
- 當客戶端將命令發出後,假如客戶端和服務端所在服務器相距很遠,那麼一次RTT(Round-Trip Time: 往返時延)將會達到毫秒級別,這將嚴重影響Redis的吞吐量
- 無論是服務端進程還是客戶端進程,調用write操作將數據寫到本地操作系統內核的發送緩衝中時,如果發送緩衝滿了,就需要等待緩衝空出空閒空間來,這個就是寫操作IO操作的真正耗時。
PIPELINE原理
- 將多個命令打包組成命令塊
- 將命令塊一次性批量發送給服務端
- 服務端依此處理完後將結果集打包
- 批量返回所有結果
上面命令只有一次網絡往返時延和兩次網絡IO,所以可以有效提升性能