參考文件:
(1)(2)
1、基本原理
採用多路 i/o 復用技術可以讓單個執行緒高效的處理多個連線請求(儘量減少網路io的時間消耗)
(1)為什麼不採用多程序或多執行緒處理?
多執行緒處理可能涉及到鎖(2)單執行緒處理的缺點?多執行緒處理會涉及到執行緒切換而消耗cpu
無法發揮多核cpu效能,不過可以通過在單機開多個redis例項來完善3、什麼是多路i/o復用(epoll)
(1) 網路io都是通過socket實現,server在某乙個埠持續監聽,客戶端通過socket(ip+port)與伺服器建立連線(serversocket.accept),成功建立連線之後,就可以使用socket中封裝的inputstream和outputstream進行io互動了。針對每個客戶端,server都會建立乙個新執行緒專門用於處理
(2) 預設情況下,網路io是阻塞模式,即伺服器執行緒在資料到來之前處於【阻塞】狀態,等到資料到達,會自動喚醒伺服器執行緒,著手進行處理。阻塞模式下,乙個執行緒只能處理乙個流的io事件
(3) 為了提公升伺服器執行緒處理效率,有以下三種思路
(1)非阻塞【忙輪詢】:採用死迴圈方式輪詢每乙個流,如果有io事件就處理,這樣可以使得乙個執行緒可以處理多個流,但是效率不高,容易導致cpu空轉4、其它開源軟體採用的模型(2)select**(無差別輪詢):可以觀察多個流的io事件,如果所有流都沒有io事件,則將執行緒進入阻塞狀態,如果有乙個或多個發生了io事件,則喚醒執行緒去處理。但是還是得遍歷所有的流,才能找出哪些流需要處理。如果流個數為n,則時間複雜度為o(n)
(3)epoll**:select**有乙個缺點,執行緒在被喚醒後輪詢所有的stream,還是存在無效操作。 epoll會哪個流發生了怎樣的i/o事件通知處理執行緒,因此對這些流的操作都是有意義的,複雜度降低到了o(1)
nginx:多程序單執行緒模型memcached:單程序多執行緒模型
如何理解redis單執行緒
redis是以socket方式通訊,socket服務端可同時接受多個客戶端請求連線,也就是說,redis服務同時面對多個redis客戶端連線請求,而redis服務本身是單執行緒執行。推薦學習 redis 教程 假設,現在有a,b,c,d,e五個客戶端同時發起redis請求,a優先稍微一點點第乙個到達...
Redis單執行緒
redis 的單執行緒主要是指 redis 的網路 io 和鍵值對讀寫是由乙個執行緒來完成的,這也是 redis 對外提供鍵值儲存服務的主要流程。當多個客戶端發起命令,這些命令併發執行時,在redis內部,會排隊逐個執行,也就是執行命令的那個操作是由乙個執行緒執行的。但 redis 的其他功能,比如...
redis的單執行緒
1 完全基於記憶體,絕大部分請求是純粹的記憶體操作,非常快速。資料存在記憶體中,類似於hashmap,hashmap的優勢就是查詢和操作的時間複雜度都是o 1 2 資料結構簡單,對資料操作也簡單,redis中的資料結構是專門進行設計的 3 採用單執行緒,避免了不必要的上下文切換和競爭條件,也不存在多...