2014-12-07 104 views
2

在這page listing the redis clients,我計算了8個異步庫。我的理解是,像node.js或龍捲風這樣的框架只有在異步回調函數不相互爭奪I/O時纔有意義,否則你可能會同步。爲什麼在Redis中使用異步客戶端是有意義的?

但Redis是單線程的。所以他們實際上是爲了I/O而戰。 Redis的單線程特性是否取消了異步回調的所有潛在優點?爲什麼在Redis中使用異步客戶端是有意義的?

回答

7

Redis的單線程性質與異步客戶端的潛在優勢無關。儘管具有獨特的事件循環,但Redis能夠同時管理大量客戶端連接。我已經看到在單個Redis實例上具有高達30000個連接的基準測試。

只要考慮到像Redis或memcached這樣的內存中鍵/值存儲區,性能和延遲由網絡往返而不是服務器端CPU消耗所支配。當然,當網絡鏈路飽和時,網絡往返時延會增加,但這並不意味着當網絡遠離飽和時網絡往返時延可以忽略不計。例如,在一個負載很輕的1 GbE網絡上,RTT延遲接近200 us並不罕見。

其結果是,除了網絡鏈接接近飽和時,客戶端連接(或異步回調函數)很少會相互競爭I/O。套接字與緩衝區相關聯,緩衝了網絡上讀寫操作的成本。大多數情況下,等待狀態不是由於I/O競爭,而是由於網絡的延遲。

有各種方法來降低網絡延遲的影響:

  • 流水線:分組多個命令在一起,使得網絡往返的每命令(實際上,這是同步流水線)的基團所許一次。

  • 非阻塞I/O:雖然它不會減少往返次數(或其單獨成本),但異步客戶端可以同時管理它們。其結果是網絡延遲對應用程序吞吐量的影響較小(或不影響)。

  • 多個客戶端連接:每個客戶端連接都有自己的套接字,因此有自己的緩衝區。更多緩衝區通常意味着更好的吞吐量更多的連接增加了同時和/或異步處理事件的機會,並對整體性能產生積極影響。

這些解決方案都由Redis生態系統支持,並且可以結合使用以最大限度地提高性能。異步客戶端通常允許這種組合。什麼是異步客戶端的用例?這裏有幾個例子:

  • 實現異步流水線,以最小化單個連接的等待狀態。

  • 在不依賴額外線程池的情況下,將Redis連接與現有事件循環(如libevent,Node.js,Tornado,Twisted等)集成在一起。

  • 支持具有多個Redis實例的數據分片。在這種情況下,客戶端應用程序可能需要並行訪問各種實例。使用異步客戶端,可以通過獨特的線程輕鬆完成。

  • 支持基於客戶端應用程序與各種主/從實例的預連接的HA彈性模型。

事件循環,異步庫和/或協程類機制是大多數有效的NoSQL引擎的基石之一。

相關問題