redis爲什麼是單線程而且速度快?

redis支持的5種數據類型:
  1.String(字符串)

  2.List(數組或列表)

  3.Set(集合)

  4.Hash(哈希或字典)

  5.ZSet(有序集合)

數據庫的工作模式按存儲方式可分爲:

  硬盤數據庫和內存數據庫。Redis 將數據儲存在內存裏面,讀寫數據的時候都不會受到硬盤 I/O 速度的限制,所以速度極快。Redis採用的是基於內存的採用的是單進程單線程模型的 KV 數據庫,由C語言編寫,官方提供的數據是可以達到100000+的QPS(每秒內查詢次數)。

那麼爲什麼Redis是單線程的?
  官方解釋是因爲Redis是基於內存的操作,CPU不是Redis的瓶頸,Redis的瓶頸最有可能是機器內存的大小或者網絡帶寬。既然單線程容易實現,而且CPU不會成爲瓶頸,那就順理成章地採用單線程的方案了(畢竟採用多線程會有很多麻煩!)。看到這裏,你可能會氣哭!本以爲會有什麼重大的技術要點才使得Redis使用單線程就可以這麼快,沒想到就是一句官方看似糊弄我們的回答!但是,我們已經可以很清楚的解釋了爲什麼Redis這麼快,並且正是由於在單線程模式的情況下已經很快了,就沒有必要在使用多線程了!

但是,我們使用單線程的方式是無法發揮多核CPU 性能,不過我們可以通過在單機開多個Redis 實例來完善!

注意:
  這裏我們一直在強調的單線程,只是在處理我們的網絡請求的時候只有一個線程來處理,一個正式的Redis Server運行的時候肯定是不止一個線程的,這裏需要大  家明確的注意一下!例如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 具有很高的吞吐量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章