天天看點

redis單線程&IO多路複用

https://www.cnblogs.com/myseries/p/11733861.html

redis單線程:

redis是以socket方式通信,socket服務端可同時接受多個用戶端請求連接配接,也就是說,redis服務同時面對多個redis用戶端連接配接請求,而redis服務本身是單線程運作。

        假設,現在有A,B,C,D,E五個用戶端同時發起redis請求,A優先稍微一點點第一個到達,然後是B,C,D,E依次到達,此時redis服務端開始處理A請求,建立連接配接需要30秒,擷取請求資料需要10秒,然後處理資料需要0.1秒,回送資料給用戶端需要5秒,總共大概需要45秒。也就是說,下一個B請求需要等待45秒,這裡注意,也許這五個幾乎同時請求,由于socket可以同時處理多個請求,是以建立網絡連接配接階段時間差可忽略,但是在第二階段,服務端需要什麼事都不幹,坐等10秒中,對于CPU和用戶端來說是無法忍受的。是以說單線程效率非常,非常低,但是正是因為這些類似問題,Redis單線程本質上并不是如此運作。接下來讨論redis真正的單線程運作方式。

        用戶端與服務端建立連接配接交由socket,可以同時建立多個連接配接(這裡應該是多線程/多程序),建立的連接配接redis是知道的(為什麼知道,去看socket程式設計,再次強調基礎很重要),然後redis會基于這些建立的連接配接去探測哪個連接配接已經接收完了用戶端的請求資料(注意:不是探測哪個連接配接建立好了,而是探測哪個接收完了請求資料),而且這裡的探測動作就是單線程的開始,一旦探測到則基于接收到的資料開始資料處理階段,然後傳回資料,再繼續探測下一個已經接收完請求資料的網絡連接配接。注意,從探測到資料處理再到資料傳回,全程單線程。這應該就是所謂的redis單線程。

redis I/O多路複用:

這裡“多路”指的是多個網絡連接配接,“複用”指的是複用同一個線程。

多路I/O複用模型是利用 select、poll、epoll 可以同時監察多個流的 I/O 事件的能力,在空閑的時候,會把目前線程阻塞掉,當有一個或多個流有 I/O 事件時,就從阻塞态中喚醒,于是程式就會輪詢一遍所有的流(epoll 是隻輪詢那些真正發出了事件的流),并且隻依次順序的處理就緒的流,這種做法就避免了大量的無用操作。

舉個例子:假設你是一個老師,讓30個學生解答一道題目,然後檢查學生做的是否正确

你站在講台上等,誰解答完誰舉手。這時C、D舉手,表示他們解答問題完畢,你下去依次檢查C、D的答案,然後繼續回到講台上等。此時E、A又舉手,然後去處理E和A。。。

這種就是IO複用模型,Linux下的select、poll和epoll就是幹這個的。将使用者socket對應的fd注冊進epoll,然後epoll幫你監聽哪些socket上有消息到達,這樣就避免了大量的無用操作。此時的socket應該采用非阻塞模式。

https://blog.csdn.net/qq_29066329/article/details/96284790

redis單線程&IO多路複用

為什麼Redis單線程模型效率這麼高?

1.基于非阻塞IO的多路複用

2.基于記憶體操作

3.單線程避免了線程之間的上下文切換

繼續閱讀