**:
很多同學對redis的單執行緒和i/o多路復用技術並不是很了解,所以我用簡單易懂的語言讓大家了解下redis單執行緒和i/o多路復用技術的原理,對學好和運用好redis打下基礎。
一、redis的單執行緒理解
redis客戶端對服務端的每次呼叫都經歷了傳送命令,執行命令,返回結果三個過程。其中執行命令階段,由於redis是單執行緒來處理命令的,所有到達服務端的命令都不會立刻執行,所有的命令都會進入乙個佇列中,然後逐個執行,並且多個客戶端傳送的命令的執行順序是不確定的,但是可以確定的是不會有兩條命令被同時執行,不會產生併發問題,這就是redis的單執行緒基本模型。
redis伺服器通過socket(套接字)與客戶端或其他redis伺服器進行連線,而檔案事件就是伺服器對socket操作的抽象。伺服器與客戶端或其他伺服器的通訊會產生相應的檔案事件,而伺服器通過監聽並處理這些事件來完成一系列網路通訊操作。
redis基於reactor模式開發了自己的網路事件處理器——檔案事件處理器,檔案事件處理器使用i/o多路復用程式來同時監聽多個socket(i/o多路復用技術下面有介紹),並根據socket目前執行的任務來為socket關聯不同的事件處理器。當被監聽的socket準備好執行連線應答、讀取、寫入、關閉等操作時,與操作相對應的檔案事件就會產生,這時檔案事件處理器就會呼叫socket之前已關聯好的事件處理器來處理這些事件。
檔案事件處理器的構成:
注意:其中i/o多路復用程式通過佇列向檔案事件分派器傳送socket
二、i/o多路復用技術
關於i/o多路復用(又被稱為「事件驅動」),首先要理解的是,作業系統為你提供了乙個功能,當你的某個socket可讀或者可寫的時候,它可以給你乙個通知。這樣當配合非阻塞的socket使用時,只有當系統通知我哪個描述符可讀了,我才去執行read操作,可以保證每次read都能讀到有效資料而不做純返回-1和eagain的無用功,寫操作類似。
作業系統的這個功能是通過select/poll/epoll/kqueue之類的系統呼叫函式來實現,這些函式都可以同時監視多個描述符的讀寫就緒狀況,這樣,多個描述符的i/o操作都能在乙個執行緒內併發交替地順序完成,這就叫i/o多路復用,這裡的「多路」指的是多個網路連線,「復用」指的是復用同乙個redis處理執行緒。(正如上圖所示)
採用多路 i/o 復用技術可以讓單個執行緒高效的處理多個連線請求(儘量減少網路 i/o 的時間消耗),且 redis 在記憶體中運算元據的速度非常快,也就是說記憶體內的操作不會成為影響redis效能的瓶頸,所有 redis 具有很高的吞吐量。
三、常見疑問解答
1、redis的單執行緒為什麼這麼快?
1.完全基於記憶體,絕大部分請求是純粹的記憶體操作,非常快速。資料存在記憶體中,類似於hashmap,hashmap的優勢就是查詢和操作的時間複雜度都是o(1);
2.資料結構簡單,對資料操作也簡單,redis中的資料結構是專門進行設計的;
3.採用單執行緒,避免了不必要的上下文切換和競爭條件,也不存在多程序或者多執行緒導致的切換而消耗 cpu,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現死鎖而導致的效能消耗;
4.使用多路i/o復用模型,非阻塞i/o;
5.redis直接自己構建了vm 機制 ,因為一般的系統呼叫系統函式的話,會浪費一定的時間去移動和請求;
2、為什麼不採用多程序或多執行緒處理?
1.多執行緒處理可能涉及到鎖
2.多執行緒處理會涉及到執行緒切換而消耗cpu
3、單執行緒處理的缺點?
1.耗時的命令會導致併發的下降,不只是讀併發,寫併發也會下降
2.無法發揮多核cpu效能,不過可以通過在單機開多個redis例項來完善
redis採用了執行緒封閉的方式,把任務封閉在乙個執行緒,自然避免了執行緒安全問題,不過對於需要依賴多個redis操作(即:多個redis操作命令)的復合操作來說,依然需要鎖,而且有可能是分布式鎖。
Redis單執行緒理解
簡介 從接觸redis到現在,一直被它的單執行緒問題困擾,這對於乙個苛求原理的我來說是種折磨,今天吃飯途中看了幾篇部落格,茅塞頓開。個人理解 redis分客戶端和服務端,一次完整的redis請求事件有多個階段 客戶端到伺服器的網路連線 redis讀寫事件發生 redis服務端的資料處理 單執行緒 資...
如何理解redis單執行緒
redis是以socket方式通訊,socket服務端可同時接受多個客戶端請求連線,也就是說,redis服務同時面對多個redis客戶端連線請求,而redis服務本身是單執行緒執行。推薦學習 redis 教程 假設,現在有a,b,c,d,e五個客戶端同時發起redis請求,a優先稍微一點點第乙個到達...
Redis單執行緒
redis 的單執行緒主要是指 redis 的網路 io 和鍵值對讀寫是由乙個執行緒來完成的,這也是 redis 對外提供鍵值儲存服務的主要流程。當多個客戶端發起命令,這些命令併發執行時,在redis內部,會排隊逐個執行,也就是執行命令的那個操作是由乙個執行緒執行的。但 redis 的其他功能,比如...