文章目錄
- 1.redis網絡處理流
- 2.理解通知機制
1.redis網絡處理流
10個客戶端通過TCP與Redis建立socket連接,發送GET name指令到服務器端。服務器端的網卡接收數據,數據進入內核態的網絡協議棧。Redis通過IO多路復用機制中的epoll向內核注冊監聽這些socket的狀態。當內核檢測到某個socket的接收緩沖區有數據時,epoll通知Redis(用戶態),告知該socket準備就緒,Redis被喚醒處理。Redis調用read系統調用,從內核緩沖區讀取命令數據到用戶空間內存,解析命令并在用戶空間查詢key “name” 的值。隨后Redis調用write系統調用,將結果寫入socket發送緩沖區,內核通過網卡將數據發送回對應客戶端。整個過程通過epoll機制避免了無效輪詢,提高了性能。
2.理解通知機制
下面是 select、poll、epoll 三種通知機制的主要區別總結:
特性 | select | poll | epoll |
---|---|---|---|
最大監聽數量 | 通常最大 1024 個(受 FD_SETSIZE 限制) | 理論上無數量限制 | 理論上無數量限制 |
傳遞事件集合方式 | 通過固定大小的位圖數組傳遞文件描述符集合 | 通過傳遞一個數組結構 | 通過內核維護的紅黑樹,注冊一次后直接使用 |
IO 事件檢測方式 | 每次調用都遍歷全部描述符檢測事件 | 每次調用都遍歷全部描述符檢測事件 | 內核直接維護就緒事件鏈表,只返回就緒的描述符 |
用戶態和內核態切換 | 每次調用都傳遞所有描述符,切換開銷大 | 同select,調用時傳遞所有描述符 | 注冊事件時切換一次,等待事件時無須傳遞所有描述符,切換開銷小 |
性能(時間復雜度) | O(n),n 為描述符數量 | O(n) | O(1) |
支持觸發模式 | 只支持水平觸發(Level Trigger) | 只支持水平觸發 | 支持水平觸發和邊緣觸發(Edge Trigger) |
適用場景 | 小規模連接(幾百個以內) | 中等規模連接 | 大規模高并發連接(上萬級別) |