Redis 事件機制詳解

Redis 事件機制詳解

Redis 的事件機制是其高性能和高并發能力的關鍵之一,它采用Reactor 模型,基于文件事件驅動機制實現高效的 I/O 處理。Redis 的事件機制主要分為以下幾類:

  1. 文件事件(File Event) —— 處理網絡 I/O,如客戶端請求、響應、數據同步等。
  2. 時間事件(Time Event) —— 處理定時任務,如過期鍵清理、定期任務等。
  3. 事件分派機制 —— 負責協調和分發上述事件。

1. 文件事件(File Event)

1.1 概述

Redis 采用單線程處理客戶端請求,但借助 I/O 多路復用 實現了對大量客戶端連接的高效管理。文件事件機制主要用于:

  • 處理客戶端的請求和響應
  • 與其他 Redis 實例(主從復制)進行數據同步
  • 持久化(AOF 或 RDB)的文件操作

1.2 I/O 多路復用

Redis 通過 I/O 多路復用技術在單線程下監聽多個客戶端連接,底層可以使用:

  • epoll(Linux,推薦)
  • kqueue(BSD、macOS)
  • select(不推薦,性能較低)
  • poll(早期 Linux 版本)

不同操作系統會選擇最佳的多路復用方式,例如,在 Linux 下 Redis 默認使用 epoll

1.3 文件事件的類型

Redis 的文件事件由 aeFileEvent 結構體管理,它定義了 Redis 可能監聽的事件類型:

  • AE_READABLE :文件可讀事件(客戶端發送請求、主從同步數據)
  • AE_WRITABLE :文件可寫事件(返回數據給客戶端)

當某個事件發生時,會觸發相應的回調函數,例如:

  • acceptTcpHandler:接受新的客戶端連接
  • readQueryFromClient:讀取客戶端請求
  • sendReplyToClient:向客戶端發送響應數據

1.4 事件的監聽與觸發

Redis 在 ae.c 文件中維護了一個事件驅動框架

  • aeCreateFileEvent():注冊事件
  • aeDeleteFileEvent():刪除事件
  • aeProcessEvents():監聽并觸發事件
  • aeMain():事件循環主函數,調用 aeProcessEvents() 處理所有事件

2. 時間事件(Time Event)

2.1 概述

時間事件用于執行定時任務,比如:

  • 服務器定期維護(清理過期 key、AOF 持久化)
  • 慢查詢監控
  • 統計信息更新
  • 定期執行回調函數

2.2 時間事件的數據結構

時間事件由 aeTimeEvent 結構體管理,包括:

  • id:時間事件 ID
  • when:下一次執行的時間
  • timeProc:時間事件的回調函數
  • finalizerProc:事件清理函數

2.3 Redis 主要的時間事件

  • serverCron()(默認 100ms 執行一次)
    • 關閉空閑連接
    • 處理過期鍵
    • AOF 重寫
    • 主從復制任務
  • activeExpireCycle()(過期鍵清理)
    • 采用惰性刪除定期清理相結合的方式
  • bioProcessBackgroundJobs()(后臺異步任務)
    • 用于 AOF、RDB 持久化

3. 事件分派機制(Reactor 模型)

3.1 事件循環(Event Loop)

Redis 采用事件驅動模型,其事件循環 aeMain() 負責不斷監聽和分派事件:

  1. 處理文件事件
  2. 處理時間事件
  3. 如果沒有事件發生,則進入阻塞等待(降低 CPU 負載)

3.2 事件優先級

  • 文件事件優先級高于時間事件,即 Redis 會先處理網絡 I/O,再處理定時任務。
  • 時間事件是定期執行的,而文件事件是隨時觸發的。

3.3 事件循環的核心代碼

ae.c 中,aeMain() 負責整個事件循環:

void aeMain(aeEventLoop *eventLoop) {eventLoop->stop = 0;while (!eventLoop->stop) {int numevents;/* 計算下一個時間事件需要的時間間隔 */int64_t milliseconds = aeGetTimeTillNextEvent(eventLoop);/* 監聽事件(I/O 多路復用) */numevents = aeApiPoll(eventLoop, milliseconds);/* 處理就緒的文件事件 */aeProcessEvents(eventLoop, AE_FILE_EVENTS);/* 處理時間事件 */aeProcessEvents(eventLoop, AE_TIME_EVENTS);}
}

Redis 通過 aeApiPoll() 調用底層的 epoll_wait()(或 select() 等)來監聽事件。


4. Redis 事件機制的優勢

Redis 采用單線程模型,但借助 I/O 多路復用,使其能夠高效地處理大量并發請求,主要優勢包括:

  1. 避免了線程切換開銷:單線程避免了多線程帶來的上下文切換開銷。
  2. I/O 多路復用提升吞吐量epoll 提供高效的事件通知機制,支持高并發連接。
  3. 合理的事件優先級設計:優先處理網絡 I/O,保證請求處理的實時性。
  4. 時間事件支持定時任務:自動管理過期鍵、持久化等任務。

5. 總結

Redis 的事件機制基于 Reactor 模型,由文件事件(I/O 處理)、時間事件(定時任務)和事件分派機制(事件循環)組成。其核心是 I/O 多路復用,使得單線程的 Redis 能夠高效處理并發請求。

核心要點

  • 文件事件:基于 epoll 實現高效的網絡 I/O 處理(請求、響應、主從同步)。
  • 時間事件:管理定時任務,如過期鍵清理、慢查詢統計、持久化等。
  • 事件循環:協調文件事件和時間事件,確保高效運行。

Redis 通過事件驅動架構,保證了其高性能和高并發能力,是 NoSQL 數據庫領域的標桿之一。

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

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

相關文章

【LangChain入門 3 Prompts組件】聊天提示詞模板 ChatPromptTemplate

文章目錄 一、 聊天信息提示詞模板1.1 使用關鍵字1.2 使用SystemMessage, HumanMessage, AIMessage來定義消息1.3 使用MessagesPlaceholder 在特定未知添加消息列表 二、關鍵類介紹2.1 ChatPromptTemplate 類2.1.1 from_messages()2.1.2 format_messages()2.1.3 format_prompt(…

Flutter TextFormField 完全手冊與設計最佳實踐

目錄 1. 引言 2. TextFormField 的基本用法 3. 主要屬性 4. 自定義 TextFormField 樣式 4.1 設置邊框樣式 4.2 設置輸入格式限制 4.3 多行輸入 5. 結論 相關推薦 1. 引言 在 Flutter 中,TextFormField 是 TextField 的擴展版本,專為表單輸入設計…

HC-05與HC-06藍牙配對零基礎教程 以及openmv識別及遠程傳輸項目的概述

這個是上一年的項目,之前弄得不怎么完整,只有一個openmv的,所以openmv自己去我主頁找,這篇主要講藍牙 這個是我在使用openmv連接單片機1然后單片機1與單片機2通過藍牙進行通信 最終實現的效果是:openmv識別到圖形和數…

【Docker系列一】Docker 簡介

💝💝💝歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

Vue 入門到實戰 五

第5章 過渡與動畫 目錄 5.1 單元素/組件過渡 5.1.1 過渡class 5.1.2 CSS 過渡 5.1.3 CSS 動畫 5.1.4 同時使用過渡和動畫 5.1.5 JavaScript 鉤子方法 5.2 多元素/組件過渡 5.2.1 多元素過渡 5.2.2 多組件過渡 5.3 列表過渡 5.3.1 列表的普通過渡 5.3.2 列表的平滑…

Apache SeaTunnel腳本升級及參數調優實戰

最近作者針對實時數倉的Apache SeaTunnel同步鏈路,完成了雙引擎架構升級與全鏈路參數深度調優,希望本文能夠給大家有所啟發,歡迎批評指正! Apache SeaTunnel 版本 :2.3.9 Doris版本:2.0.6 MySQL JDBC Conne…

C++ 時間操作:獲取有史以來的天數與文件計數器

C 時間操作:獲取有史以來的天數與文件計數器 在C中,時間操作是一個非常重要的功能,尤其是在需要處理日期、時間戳或定時任務時。本文將介紹如何利用C的時間操作功能,實現以下兩個目標: 獲取從Unix紀元時間&#xff0…

Python Bug修復案例分析:Python 中常見的 IndentationError 錯誤 bug 的修復

在 Python 編程的世界里,代碼的可讀性和規范性至關重要。Python 通過強制使用縮進來表示代碼塊的層次結構,這一獨特的設計理念使得代碼更加清晰易讀。然而,正是這種對縮進的嚴格要求,導致開發者在編寫代碼時,稍有不慎就…

【論文筆記】Transformer

Transformer 2017 年,谷歌團隊提出 Transformer 結構,Transformer 首先應用在自然語言處理領域中的機器翻譯任務上,Transformer 結構完全構建于注意力機制,完全丟棄遞歸和卷積的結構,這使得 Transformer 結構效率更高…

CI/CD(三) 安裝nfs并指定k8s默認storageClass

一、NFS 服務端安裝(主節點 10.60.0.20) 1. 安裝 NFS 服務端 sudo apt update sudo apt install -y nfs-kernel-server 2. 創建共享目錄并配置權限 sudo mkdir -p /data/k8s sudo chown nobody:nogroup /data/k8s # 允許匿名訪問 sudo chmod 777 /dat…

【QA】單件模式在Qt中有哪些應用?

單例設計模式確保一個類僅有一個實例,并提供一個全局訪問點來獲取該實例。在 Qt 框架中,有不少類的設計采用了單例模式,以下為你詳細介紹并給出相應代碼示例。 1. QApplication QApplication 是 Qt GUI 應用程序的核心類,每個 Q…

存儲過程觸發器習題整理1

46、{blank}設有商品表(商品號,商品名,單價)和銷售表(銷售單據號,商品號,銷售時間,銷售數量,銷售單價)。其中,商品號代表一類商品,商品號、單價、銷售數量和銷售單價均為整型。請編寫…

基于ChatGPT、GIS與Python機器學習的地質災害風險評估、易發性分析、信息化建庫及災后重建高級實踐

第一章、ChatGPT、DeepSeek大語言模型提示詞與地質災害基礎及平臺介紹【基礎實踐篇】 1、什么是大模型? 大模型(Large Language Model, LLM)是一種基于深度學習技術的大規模自然語言處理模型。 代表性大模型:GPT-4、BERT、T5、Ch…

單表達式倒計時工具:datetime的極度優雅(智普清言)

一個簡單表達式,也可以優雅自成工具。 筆記模板由python腳本于2025-03-22 20:25:49創建,本篇筆記適合任意喜歡學習的coder翻閱。 【學習的細節是歡悅的歷程】 博客的核心價值:在于輸出思考與經驗,而不僅僅是知識的簡單復述。 Pyth…

最優編碼樹的雙子性

現在看一些書,不太愿意在書上面做一些標記,也沒啥特殊的原因。。哈哈。 樹的定義 無環連通圖,極小連通圖,極大無環圖。 度 某個節點,描述它的度,一般默認是出度,分叉的邊的條數。或者說孩子…

MiB和MB

本文來自騰訊元寶 MiB 和 ?MB 有區別,盡管它們都用于表示數據存儲的單位,但它們的計算方式不同,分別基于不同的進制系統。 1. ?MiB(Mebibyte)? ?MiB 是基于二進制的單位,使用1024作為基數。1 MiB 102…

Labview和C#調用KNX API 相關東西

敘述:完全沒有聽說過KNX這個協議...................我這次項目中也是簡單的用了一下沒有過多的去研究 C#調用示例工程鏈接(labview調用示例在 DEBUG文件夾里面) 通過網盤分享的文件:KNX調用示例.zip 鏈接: https://pan.baidu.com/s/1NQUEYM11HID0M4ksetrTyg?pwd…

損失函數理解(二)——交叉熵損失

損失函數的目的是為了定量描述不同模型(例如神經網絡模型和人腦模型)的差異。 交叉熵,顧名思義,與熵有關,先把模型換成熵這么一個數值,然后用這個數值比較不同模型之間的差異。 為什么要做這一步轉換&…

Kubernetes的Replica Set和ReplicaController有什么區別

ReplicaSet 和 ReplicationController 是 Kubernetes 中用于管理應用程序副本的兩種資源,它們有類似的功能,但 ReplicaSet 是 ReplicationController 的增強版本。 以下是它們的主要區別: 1. 功能的演進 ReplicationController 是 Kubernete…

信息系統運行管理員教程3--信息系統設施運維

第3章 信息系統設施運維 信息系統設施是支撐信息系統業務活動的信息系統軟硬件資產及環境。 第1節 信息系統設施運維的管理體系 信息系統設施運維的范圍包含信息系統涉及的所有設備及環境,主要包括基礎環境、硬件設備、網絡設備、基礎軟件等。 信息系統設施運維…