天天看點

Redis是單線程,為什麼這麼快?

為什麼這麼快,簡單說法: 

1.redis是基于記憶體的,記憶體的讀寫速度非常快;

2.redis是單線程的,省去了很多上下文切換線程的時間;

3.redis使用多路複用技術,可以處理并發的連接配接;

較詳細的解釋:

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 具有很高的吞吐量。

繼續閱讀