為什麼Redis是單執行緒,效能還如此高?

2022-05-26 10:30:10 字數 1540 閱讀 4868

注意:redis 單執行緒指的是網路請求模組使用了乙個執行緒,即乙個執行緒處理所有網路請求,其他模組仍用了多個執行緒。

因為cpu不是redis的瓶頸。redis的瓶頸最有可能是機器記憶體或者網路頻寬,既然單執行緒容易實現,而且cpu不會成為瓶頸,那就順理成章地採用單執行緒的方案了。關於redis的效能,官方**也有,普通筆記本輕鬆處理每秒幾十萬的請求

1、完全基於記憶體,絕大部分請求是純粹的記憶體操作,非常快速。資料存在記憶體中,類似於hashmap,hashmap的優勢就是查詢和操作的時間複雜度都是o(1);

2、資料結構簡單,對資料操作也簡單,redis中的資料結構是專門進行設計的;

3、採用單執行緒,避免了不必要的上下文切換和競爭條件,也不存在多程序或者多執行緒導致的切換而消耗 cpu,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現死鎖而導致的效能消耗;

4、使用多路i/o復用模型,非阻塞io;

5、使用底層模型不同,它們之間底層實現方式以及與客戶端之間通訊的應用協議不一樣,redis直接自己構建了vm 機制 ,因為一般的系統呼叫系統函式的話,會浪費一定的時間去移動和請求;

三、多路io復用模型,非阻塞io

下面舉乙個例子,模擬乙個tcp伺服器處理30個客戶socket。

假設你是乙個監考老師,讓30個學生解答一道競賽考題,然後負責驗收學生答卷,你有下面幾個選擇:

1. 第一種選擇:按順序逐個驗收,先驗收a,然後是b,之後是c、d。。。這中間如果有乙個學生卡住,全班都會被耽誤。

這種模式就好比,你用迴圈挨個處理socket,根本不具有併發能力。

2. 第二種選擇:你建立30個分身,每個分身檢查乙個學生的答案是否正確。 這種類似於為每乙個使用者建立乙個程序或者執行緒處理連線。

3. 第三種選擇,你站在講台上等,誰解答完誰舉手。這時c、d舉手,表示他們解答問題完畢,你下去依次檢查c、d的答案,然後繼續回到講台上等。此時e、a又舉手,然後去處理e和a。。。

這種就是io復用模型,linux下的select、poll和epoll就是幹這個的。將使用者socket對應的fd註冊進epoll,然後epoll幫你監聽哪些socket上有訊息到達,這樣就避免了大量的無用操作。此時的socket應該採用非阻塞模式

這樣,整個過程只在呼叫select、poll、epoll這些呼叫的時候才會阻塞,收發客戶訊息是不會阻塞的,整個程序或者執行緒就被充分利用起來,這就是事件驅動,所謂的reactor模式。

針對上面的舉例在redis中表現為

有30個redis客戶端(考生)與redis伺服器的網路連線模組(監考老師)保持tcp連線,客戶端會不定時的傳送請求給伺服器,當有乙個redis客戶端發起請求,會觸發unix系統像epoll這樣的系統呼叫,redis的i/o 多路復用模組封裝了底層的epoll這樣的i/o 多路復用函式,然後**到相應的事件處理器。

Redis為什麼是單執行緒還這麼快

1 redis是基於記憶體的操作,cpu不是redis的瓶頸,redis的瓶頸最有可能是機器記憶體的大小或者網路頻寬 2 採用單執行緒,避免了不必要的上下文切換和競爭條件,也不存在多程序或者多執行緒導致的切換而消耗 cpu 3 採用網路io多路復用技術來保證在多連線的時候,系統的高吞吐量。多路 指的...

Redis為什麼是單執行緒

經過多方資料收集 總結 思考,結論如下 準確地來說,該問題是 為什麼redis採用單程序單執行緒模型 我們從兩個層次去理解 第乙個層次 我們多執行緒的使用情景是io密集型,目的是為了充分利用cpu資源。也就是說當乙個執行緒io等待的時候,另乙個執行緒可以進行執行,達到充分利用cpu資源的效果,不要讓...

Redis為什麼是單執行緒的還這麼快

1 完全基於記憶體,絕大部分請求是純粹的記憶體操作,非常快速。資料存在記憶體中,類似於hashmap,hashmap的優勢就是查詢和操作的時間複雜度都是o 1 2 資料結構簡單,對資料操作也簡單,redis中的資料結構是專門進行設計的 3 採用單執行緒,避免了不必要的上下文切換和競爭條件,也不存在多...