眾所周知redis是單程序單執行緒的應用,在如今多核橫行的時代,我們不免有疑問,單執行緒的redis怎麼就成了高效能的代表
當有多個執行緒同時呼叫redis的時候,那麼單執行緒的redis是怎麼處理的呢,這裡就不得不說redis內部的io模型
首先要提到幾個概念,阻塞io,非阻塞io,同步io,非同步io,多路復用
首先我們要理解io的過程才能更好的理解上面這幾種情況,io分為兩步,第一階段是資料準備,第二階段是資料複製階段,所謂資料複製階段就是講資料從核心複製到使用者空間
所謂阻塞io,即我們傳統的阻塞概念,當乙個客戶端請求發起之後執行緒會掛起,等待服務端返回請求結果然後繼續處理業務邏輯
非阻塞io,有人認為非阻塞==非同步,其實這個是不準確的,非阻塞io的非阻塞其實只要體現在io的第一階段,非阻塞io會定時check服務端的資料準備情況,這個階段是非阻塞的,但是一旦資料準備階段完成了,執行緒就會阻塞的進行io的第二階段,即資料複製,所以非阻塞io還是屬於同步io
所以只要有執行緒阻塞的情況都是屬於同步io,執行緒完全不會阻塞掛起的才是真正的非同步io
多路復用api,多路復用最常用的就是select和epoll,多路復用的最大的特點就是多路,乙個select可以同時處理多個套接字的讀寫請求,這時候io的阻塞點往往是多路復用的api,而不是io操作本身
在redis中的io模型就是使用多路復用api程序客戶端的檢測,多路復用api可以同時監聽多個客戶端的讀寫操作,多路復用api會檢測客戶端的請求是讀操作還是寫操作,往往api會有乙個timeout,在這個時間內redis執行緒會阻塞,進行套接字的監聽,redis會給每個客戶端套接字匹配乙個指令佇列,按照佇列進行處理,同時也會將操作結果放到輸出佇列
正是通過這種多路復用的思想進行非阻塞的io,這樣才保證了redis的高效
Reids原理之IO模型
眾所周知redis是單程序單執行緒的應用,在如今多核橫行的時代,我們不免有疑問,單執行緒的redis怎麼就成了高效能的代表 當有多個執行緒同時呼叫redis的時候,那麼單執行緒的redis是怎麼處理的呢,這裡就不得不說redis內部的io模型 首先要提到幾個概念,阻塞io,非阻塞io,同步io,非同...
I O模型 I O模型
輸入 輸出 i o 是在主存和外部裝置 例如磁碟驅動器 終端和網路 之間複製資料的過程。輸入操作是從 i o 裝置複製資料到主存,輸出資料是從主存複製資料到 i o 裝置。描述的是使用者執行緒與核心的互動方式 描述的是使用者執行緒呼叫核心 i o 操作的方式 乙個 i o 操作其實分成了兩個步驟 發...
Socket模型之重疊I O模型
socket模型之重疊i o模型 這幾天一直在看關於socket程式設計的幾種非同步程式設計,我覺得關於重疊i o模型的一些基本知識,我有必要記下來。在實際的程式設計過程中,我們需要按照下面幾步來編寫我們的socket重疊模型的程式 一 在伺服器端 1 首先初始化socket套接字。由於編寫非同步套...