1. 程式人生 > >整理總結 --- Redis 為什麼說Redis是單執行緒的

整理總結 --- Redis 為什麼說Redis是單執行緒的

那麼為什麼Redis是單執行緒的

Redis 所需資源 CPU, 記憶體,  網路I/O

官方FAQ表示,因為Redis是基於記憶體的操作,CPU不是Redis的瓶頸,Redis的瓶頸最有可能是機器記憶體的大小或者網路頻寬。既然單執行緒容易實現,而且CPU不會成為瓶頸,那就順理成章地採用單執行緒的方案了(畢竟採用多執行緒會有很多麻煩!)

參考:https://redis.io/topics/faq

****注意:一直在強調的單執行緒,只是在處理我們的網路請求的時候只有一個執行緒來處理

 

Redis到底有多快

官方提供的資料是可以達到 10萬+ 的QPS(每秒內查詢次數)

 

Redis為什麼這麼快     ---  基於記憶體的多路複用I/O

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

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

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

4、使用多路I/O複用模型,非阻塞IO

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

 

單執行緒,多路複用I/O

多路I/O複用模型是利用 select、poll、epoll 可以同時監察多個流的 I/O 事件的能力,在空閒的時候,會把當前執行緒阻塞掉,當有一個或多個流有 I/O 事件時,就從阻塞態中喚醒,於是程式就會輪詢一遍所有的流(epoll 是隻輪詢那些真正發出了事件的流),並且只依次順序的處理就緒的流,這種做法就避免了大量的無用操作。

**這裡“多路”指的是多個網路連線,“複用”指的是複用同一個執行緒。

**採用多路 I/O 複用技術可以讓單個執行緒高效的處理多個連線請求(儘量減少網路 IO 的時間消耗),且 Redis 在記憶體中操作資料的速度非常快,也就是說記憶體內的操作不會成為影響Redis效能的瓶頸,主要由以上幾點造就了 Redis 具有很高的吞吐量。
 

參考:
https://www.jianshu.com/p/99fb0919f213