Redis的工作模式:請求響應式
Redis是一個使用客戶端/服務器模型(也被稱作請求/響應協議)的TCP服務器。
這說明通常來講一個一個請求的實現有以下步驟:
1.客戶端發送請求到服務器,並從socket中以堵塞的方式讀取服務器的響應數據。
2.服務器對發動的命令進行處理並把響應數據發回客戶端。
環路時間RTT:
從客戶端請求數據開始到收到服務器的響應數據截止的時間。
管道解決的問題描述:
當客戶端需要一次發送很多請求時(比如一次向一個List添加很多元素,或者向一個數據庫添加很多Key),這個環路時間會對性能造成非常大的影響。如果環路時間是250毫秒(在網絡連接非常慢的情況下),即使服務端能每秒處理10萬個請求,我們一秒最大也只能處理四個請求。
即使我們用的是本地迴環接口,本地環路時間會短得多(比如在我本機上用ping測試是0.044毫秒),但是如果你要一次進行大量寫操作,這個時間依然不少。
Redis的管道:
一個請求/響應服務器能夠做到在客戶端還沒有讀取上個返回值的時候就處理新的請求。通過這種方式客戶端就可以在不獲取每次請求的響應的情況下給服務端一次發送多個命令,並在未來的某個時間一次獲得這些所有的響應。這樣我們不再每次調用都產生RTT的花銷,所有命令加起來只產生一次RTT花銷。
使用管道要注意:
當客戶端一下子發送多條請求命令時,服務器會將這些所有命令的請求放入隊列,這樣會帶來額外的內存開銷。爲了減少內存開銷,我們最好規定一個命令數的上限,比如10000條,這樣內存開銷的上限就是這10000條命令的響應值。