RedisI/O多路復用:單線程網絡模型epoll工作流程

epoll

1. 在內核創建eventpoll結構體,返回句柄epfd(唯一標識)

? ? ? ? eventpoll包含存放被監聽的fd的紅黑樹,和存放已就緒的fd的鏈表

2. 將要監聽的fd加入到epoll紅黑樹中,并設置callback回調函數

? ? ? ? callback觸發時,就將紅黑樹的fd加入到就緒鏈表

3. 檢查就緒鏈表是否為空,如果沒有就緒的fd,則sleep等待就緒元素進入

4. 如果不為空,返回就緒fd的數量,將內核空間就緒隊列的元素拷貝到用戶空間的events中

  • select fd數量有限
  • poll雖然無限,但用鏈表存儲監聽fd過多性能不好
  • epoll使用紅黑樹,遍歷效率高

LevelTriggered

  • fd有數據可讀,會重復通知多次,直至數據被讀完
  • epoll_wait隊列中就緒的fd復制給用戶空間后不會被立刻刪除,如果數據沒有被讀完會被重新添加回隊列

EdgeTriggered

  • 當有數據可讀時只會通知一次
  • epoll_wait隊列中就緒的fd復制給用戶空間后直接移除

工作流程

單線程網絡模型流程:

1. serversocket fd注冊到epoll實例,然后給他綁定一個處理器(tcpAccepthandler)

2. 在等待就緒之前調用beforesleep,然后進去等待就緒

就緒分為兩種情況:

  1. serverSocket有可讀事件(客戶端連接上serverSocket),然后調用serversocket的處理器,將客戶端socket fd 注冊到epoll上
  2. 客戶端socket可讀,調用readQueryFromClient處理器,讀取請求數據并且寫出響應

? ? ? ? a.?readQueryFromClient處理器邏輯

????????b. 給每一個客戶端封裝一個client結構體,里面有queryBuf,將讀取的數據寫入queryBuf,然后將其數據轉換為Redis命令(封裝到argv數組)

????????c. 命令用Dict封裝,根據命令名找到對應的command,執行command得到響應結果,然后把結果寫出返回給client

????????d. client存儲著buf數組和reply鏈表接受相應結果,buf數組不夠就放到reply鏈表上

????????e. 然后將客戶端添加到server.clients_pending_write隊列,等待被寫出

全局圖

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/923561.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/923561.shtml
英文地址,請注明出處:http://en.pswp.cn/news/923561.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SmartBear API Hub助力MCP開發,無縫、安全的連接AI與外部工具

人工智能(AI)技術的應用場景日益廣泛,如何讓不同的AI系統之間實現高效、無縫的交互,成為了業界的重要課題。隨著人工智能技術的不斷進步,模型上下文協議(MCP)應運而生。MCP為不同AI系統之間提供…

如何選擇高性價比的iOS簽名服務?關鍵因素與價格區間

作為一名摸爬滾打多年的開發者,我來和你聊聊怎么挑一個靠譜又不坑的iOS簽名服務。這玩意兒選不好,輕則測試團隊干瞪眼,重則App下架,用戶投訴,簡直是我們開發者的噩夢。別光看價格!先想清楚你的核心需求在選…

MoonBit 正式加入 WebAssembly Component Model 官方文檔 !

我們非常高興地宣布,MoonBit 已正式收錄在 WebAssembly Component Model 的官方文檔中。這不僅是對 MoonBit 技術路線的一次肯定,也讓我們有機會和 Rust、Go、C# 等語言一起,出現在開發者查閱組件模型的入口頁面中。一、 關于 WebAssembly Co…

Python快速入門專業版(三十二):匿名函數:lambda表達式的簡潔用法(結合filter/map)

目錄引一、lambda表達式的基本語法:一行代碼定義函數示例1:lambda表達式與普通函數的對比二、lambda表達式的應用場景:臨時與靈活1. 臨時使用:無需定義函數名的簡單功能2. 作為參數傳遞給高階函數三、結合filter():篩選…

【LeetCode 每日一題】3025. 人員站位的方案數 I——(解法一)暴力枚舉

Problem: 3025. 人員站位的方案數 I 文章目錄整體思路完整代碼時空復雜度時間復雜度:O(N^3)空間復雜度:O(1)整體思路 這段代碼旨在解決一個幾何計數問題:給定平面上的 n 個點,計算滿足特定條件的“點對” (i, j) 的數量。 根據代…

Roo Code 診斷集成功能:智能識別與修復代碼問題

這里是引用在日常編程中,遇到代碼錯誤或警告是再常見不過的事。但如何高效定位并解決這些問題,往往考驗開發者的經驗和工具鏈的支持。 Roo Code 中有一項非常實用的功能——診斷集成(Diagnostics Integration)。它能夠與 VSCode 的…

Redis 與微服務架構結合:高并發場景下的架構藝術

🔌 Redis 與微服務架構結合:高并發場景下的架構藝術 文章目錄🔌 Redis 與微服務架構結合:高并發場景下的架構藝術🧩 一、微服務架構下的挑戰?? 典型痛點分析📊 性能瓶頸對比?? 二、Redis作為配置中心&a…

鴻蒙應用冷啟動優化:本地 KV 緩存預熱實戰指南

在鴻蒙(HarmonyOS)應用開發中,冷啟動速度直接影響用戶的初始體驗。許多應用在啟動后需要加載大量常用配置(如用戶偏好設置、主題配置)或基礎數據(如上次登錄信息、常用功能參數),若每…

Java, Rust, C ++開發智能農業APP

# 智能化農業APP開發方案 - Java、Rust、C技術整合我將為您設計一個使用Java、Rust和C開發的智能化農業APP方案,專注于現代農業的數字化轉型和智能化升級。## 系統架構設計 --------------------- | 移動客戶端 (Android/iOS) | // Java/Kotlin (Android), Swift…

PHP在線客服系統 支持獨立部署 雙語言切換 離線消息推送

內容目錄一、詳細介紹二、效果展示1.部分代碼2.效果圖展示三、學習資料下載一、詳細介紹 該在線客服系統是一款基于:Php MySql Swoole Vue3開發的獨立部署的雙語在線客服系統。 支持pch5網站、小程序、app各個用戶端使用 【為什么要開發這款在線客服系統】 原…

小程序獲取視頻第一幀

最近我在做一個小程序項目,需要在單個頁面里展示大量的視頻列表,但有個頭疼的限制:小程序官方規定,同一個頁面上最多只能放5個 video 組件,超出這個數量,視頻就會加載失敗,根本無法播放。 這個需求可把我難住了。頁面上足足有幾十個視頻,如果真放幾十個 video 標簽,不…

MATLAB 常用函數匯總大全和高級應用總結

基礎應用 1. 基本數學運算函數函數功能示例abs(x)絕對值abs(-3) → 3sqrt(x)平方根sqrt(16) → 4exp(x)指數函數 exe^xexexp(1) → 2.7183log(x)自然對數log(exp(3)) → 3log10(x)常用對數(以 10 為底)log10(100) → 2sin(x), cos(x), tan(x)三角函數&am…

vue el-cascader級聯選擇器-地區三級選擇問題記錄

1.表單編輯回顯問題處理-添加leaf葉子節點<el-form-item label"所在地區" prop"addressCode" required><el-cascader ref"cascader" v-model"form.addressCode" :props"props" change"addressChange" :c…

動態主機配置協議(DHCP)詳解

一、 概述DHCP協議Dynamic Host Configuration Protocol &#xff0c;動態主機配置協議作用&#xff1a;動態的進行IP地址分配服務端的監聽端口 67/udp客戶端監聽端口 68/udp網絡架構 C/S&#xff1a;client/serverDHCP的優勢提高配置效率減少配置錯誤DHCP的分配方式手動分配&a…

單變量單步時序預測 | TCN-LSTM時間卷積結合長短期記憶神經網絡(MATLAB)

? 一、主要功能 該代碼實現了一個結合時序卷積網絡(TCN)和長短期記憶網絡(LSTM)的混合深度學習模型,用于時間序列預測。具體任務是:利用前24個時間步的數據(輸入特征維度為24),來預測下一個時間步的值(輸出維度為1),屬于單變量時間序列滾動預測。 ? 二、算法步驟…

【智能體】rStar2-Agent

rStar2-Agent 是一篇在大模型推理領域極具洞察力和工程實力的工作&#xff0c;它沒有追求參數規模的堆砌&#xff0c;而是通過精巧的算法設計和系統優化&#xff0c;在一個14B的小模型上實現了媲美671B大模型的數學推理能力。 核心思想非常明確&#xff1a;讓模型“想得更聰明”…

Coze源碼分析-資源庫-創建知識庫-后端源碼-核心技術與總結

11. 核心技術特點 11.1 知識庫創建的分層架構設計 清晰的職責分離&#xff1a; API層&#xff08;knowledge_service.go&#xff09;&#xff1a;負責知識庫創建請求處理、參數驗證、響應格式化應用層&#xff08;knowledge.go&#xff09;&#xff1a;負責知識庫創建業務邏輯編…

Nano Banana制作3D立體打印效果圖

Nano Banana介紹Nano Banana 是 Google 于 2024 年推出的革命性 AI 驅動圖像生成與編輯模型&#xff0c;正式名稱為 Gemini 2.5 Flash Image。以下是對它的詳細介紹&#xff1a;技術背景&#xff1a;Nano Banana 基于 Google DeepMind 最新的 Gemini 2.5 Flash Image 架構&…

繼續吐槽Rstudio

前言 繼上次《怪談級別疑難問題收錄》后&#xff0c;怪談級別的疑難問題又更新了&#xff0c;這次更新了三個讓人吐血的奇葩問題&#xff0c;其中就包括大家又愛又恨的Rstudio&#xff0c;一起圍觀下。 本教程基于Linux環境演示&#xff0c;計算資源不足的同學可參考&#xf…

C++:string模擬實現中的賦值拷貝函數現代寫法詭異地崩掉了......

事情是這樣的&#xff1a;博主今天回看以前實現過的string&#xff0c;當時就遇到了一個bug:可見博主當時的破防。因為最近在集中復盤C初階部分&#xff0c;就有點好奇年輕的時候自己寫的模擬string是什么樣。沒想到給我自己留了個bug。現在來細看這個場景&#xff1a;為了測試…