Redis單執行緒為什麼執行效率這麼高?

2022-02-14 18:25:16 字數 1792 閱讀 9986

一、redis為什麼是單執行緒

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

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

二、redis為什麼這麼快

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

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

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

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

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

三、多路i/o復用模型,非阻塞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 多路復用函式,然後**到相應的事件處理器。

最後多路i/o復用模型圖

檔案事件處理器使用 i/o 多路復用模組同時監聽多個 fd(檔案描述符),當 accept、read、write 和 close 檔案事件產生時,檔案事件處理器就會** fd 繫結的事件處理器。

雖然整個檔案事件處理器是在單執行緒上執行的,但是通過 i/o 多路復用模組的引入,實現了同時對多個 fd 讀寫的監控,提高了網路通訊模型的效能,同時也可以保證整個 redis 服務實現的簡單。

redis除了記憶體操作之外,其他就不要過度解讀了,據說redis6要加多執行緒了。

為什麼說Redis單執行緒效率高

redis效率高的主要原因有下面幾個 redis採用的是基於記憶體的採用的是單程序單執行緒模型的 kv 資料庫,由c語言編寫,官方提供的資料是可以達到100000 的qps 每秒內查詢次數 這個資料不比採用單程序多執行緒的同樣基於記憶體的 kv 資料庫 memcached 差!上圖是redis官方的...

Redis為什麼是單執行緒

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

面試 為什麼Redis是單執行緒

先給下官網回答 分析 多執行緒使用場景 a充分利用多核cpu b 檔案或者網路io密集型 任務排程 1 redis在linux上 使用管道每秒可以處理百萬請求 如果都是時間複雜度o n 或o log n 命令 單核足以支撐 所以a不滿足 2 redis是針對記憶體操作 所以檔案io不滿足 redis...