Redis線程IO模型

Redis是單線程程序,採用非阻塞ID來處理請求.非阻塞IO在套接字對象上提供了一個選項Non_Blocking,當服務器

這個選項打開時,讀寫方法不會阻塞,而是能讀多少讀多少,能寫多少寫多少.能讀多少取決於內核爲套接字分數據結構

配的讀緩衝區內部的數據字節數,能寫多少取決於內核爲套接字分配的寫緩衝區的空閒空間字節數.讀方法和線程

寫方法都會經過返回值來告知程序實際讀寫了多少字節.對象

有了非阻塞IO意味着線程在讀寫IO時能夠沒必要再阻塞了,讀寫能夠瞬間完成而後線程能夠繼續幹別的事了.隊列

  • 事件輪詢(多路複用):select,epoll,kqueue
  • 指令隊列:Redis會將每一個客戶端套接字(客戶端鏈接)都關聯到一個指令隊列.客戶端的指令經過隊列來排隊
                      順序處理,先到先服務.
  • 響應隊列:Redis一樣也會爲每一個客戶端套接字關聯一個響應隊列,Redis服務器經過響應隊列來將指令的返回
                      結果回覆給客戶端.若是隊列爲空,那麼意味着鏈接暫時處於空閒狀態,不須要去獲取寫事件,也就是
                      能夠將當前的客戶端描述符從write_fds裏面移出來.等到隊列有數據了,再將描述符放進去.
  • 定時任務:Redis的定時任務會記錄再一個被稱爲最小堆的數據結構中.這個堆中,最快要執行的任務排在堆的最                  上方.在每一個循環週期,Redis都會將最小堆裏面已經到點的任務當即進行處理.處理完畢後,將最快要執                  行的任務還須要的時間記錄下來,這個時間就是select系統調用的timeout參數.      
相關文章
相關標籤/搜索