《Redis設計與實現》之第十二章 事件

2022-08-12 18:42:12 字數 3793 閱讀 2370

redis伺服器是乙個事件驅動程式,伺服器需要處理兩類事件:

檔案事件:

檔案事件就是伺服器對套接字(socket)操作的抽象,伺服器和客戶端的通訊會產生檔案事件

時間事件:

時間事件就是伺服器對定時操作(比如servercron函式)的抽象,redis伺服器中的一些操作需要在給定的時間點執行

一,檔案事件

檔案事件處理程式是基於reactor的網路通訊程式,是對套接字操作的抽象,每當套接字變成可應答、可讀、可寫的時候,相應的檔案事件就會產生。

1.檔案事件處理器的組成

1.1,套接字:

socket

1.2,io多路復用程式:

負責監聽多個套接字,並向檔案事件分派器傳送產生了事件的套接字。

由於檔案事件可能併發的出現,所以io多路復用程式會把所有產生事件的套接字放到乙個佇列裡,然後通過這個佇列,以有序,同步,每次乙個套接字的方式向檔案事件分派器傳送套接字。當上乙個套接字產生的事件被處理完才傳送下乙個套接字

1.3,檔案事件分派器:

接收io多路復用程式傳來的套接字,並根據套接字產生的事件的型別,呼叫相應的事件處理器

1.4,事件處理器:

處理器其實就是乙個函式,它們定義了某個事件發生時,伺服器應該執行的動作。伺服器會為執行不同任務的套接字關聯不同事件處理器

2,i/o多路復用程式的實現

redis的i/o堵路復用程式的所有功能都是通過包裝  select,epoll等i/o多路復用函式庫來實現。每個i/o多路函式庫在redis原始碼中都對應乙個單獨的檔案。

redis程式會在編譯時自動選擇系統中效能最高的i/o多路復用函式庫,來作為redis的i/o多路復用程式的底層實現。

3,事件的型別

ae_readable事件:

當客戶端對套接字執行wirte操作,或執行close操作。此時套接字變得可讀。

當客戶端對伺服器監聽的套接字執行connect操作。此時套接字變得可讀。

ae_writeable事件:

當客戶端對套接字執行read操作,此時套接字變得可寫。

i/o多路復用程式讓伺服器同時監聽套接字的ae_readable事件和ae_writeable事件,如果乙個套接字同時產生了這兩種事件(只有非阻塞io才能同時讀寫),檔案事件處理器優先處理ae_readable事件,然後才處理ae_writeable事件。

4,api

5,檔案事件的處理器

redis為檔案事件編寫了多個處理器,這些事件處理器分別用來實現不同的網路通訊需求:

5.1,連線應答處理器

accpettcphandler函式是redis的連線應答處理器,用來對連線伺服器的客戶端進行應答。

當伺服器進行初始化時,程式會將這個連線應答處理器和伺服器監聽套接字的ae_readable事件關聯起來,當有客戶端用connect函式連線伺服器監聽的套接字時,套接字就會產生ae_readable事件,引發連線應答處理器執行,並執行相應的套接字應答操作。

5.2,命令請求處理器

readqueryfromclient函式是redis的命令請求處理器,用來接受客戶端傳來的命令請求。

當乙個客戶端通過連線應答處理器成功連線到伺服器後,伺服器會將客戶端套接字的ae_readable事件和命令請求處理器關聯起來,當客戶端向伺服器傳送命令請求時,套接字產生ae_readable事件,引發命令請求處理器執行,並執行相應的套接字讀入操作。

5.3,命令回覆處理器

sendreplytoclient函式是redis的命令回覆處理器,這個處理器負責將伺服器執行命令後得到的命令回覆通過套接字返回給客戶端。

當伺服器有命令回覆需要傳送給客戶端時,伺服器會將客戶端套接字的ae_writeable事件和命令回覆處理器關聯起來,當客戶端準備好接收伺服器傳回的命令回覆時,就會產生ae_writeable事件,引發命令回覆處理器執行,並執行相應的套接字寫入操作

**於:

redis伺服器是乙個事件驅動程式,伺服器需要處理兩類事件:

檔案事件:

檔案事件就是伺服器對套接字(socket)操作的抽象,伺服器和客戶端的通訊會產生檔案事件

時間事件:

時間事件就是伺服器對定時操作(比如servercron函式)的抽象,redis伺服器中的一些操作需要在給定的時間點執行

一,檔案事件

檔案事件處理程式是基於reactor的網路通訊程式,是對套接字操作的抽象,每當套接字變成可應答、可讀、可寫的時候,相應的檔案事件就會產生。

1.檔案事件處理器的組成

1.1,套接字:

socket

1.2,io多路復用程式:

負責監聽多個套接字,並向檔案事件分派器傳送產生了事件的套接字。

由於檔案事件可能併發的出現,所以io多路復用程式會把所有產生事件的套接字放到乙個佇列裡,然後通過這個佇列,以有序,同步,每次乙個套接字的方式向檔案事件分派器傳送套接字。當上乙個套接字產生的事件被處理完才傳送下乙個套接字

1.3,檔案事件分派器:

接收io多路復用程式傳來的套接字,並根據套接字產生的事件的型別,呼叫相應的事件處理器

1.4,事件處理器:

處理器其實就是乙個函式,它們定義了某個事件發生時,伺服器應該執行的動作。伺服器會為執行不同任務的套接字關聯不同事件處理器

2,i/o多路復用程式的實現

redis的i/o堵路復用程式的所有功能都是通過包裝  select,epoll等i/o多路復用函式庫來實現。每個i/o多路函式庫在redis原始碼中都對應乙個單獨的檔案。

redis程式會在編譯時自動選擇系統中效能最高的i/o多路復用函式庫,來作為redis的i/o多路復用程式的底層實現。

3,事件的型別

ae_readable事件:

當客戶端對套接字執行wirte操作,或執行close操作。此時套接字變得可讀。

當客戶端對伺服器監聽的套接字執行connect操作。此時套接字變得可讀。

ae_writeable事件:

當客戶端對套接字執行read操作,此時套接字變得可寫。

i/o多路復用程式讓伺服器同時監聽套接字的ae_readable事件和ae_writeable事件,如果乙個套接字同時產生了這兩種事件(只有非阻塞io才能同時讀寫),檔案事件處理器優先處理ae_readable事件,然後才處理ae_writeable事件。

4,api

5,檔案事件的處理器

redis為檔案事件編寫了多個處理器,這些事件處理器分別用來實現不同的網路通訊需求:

5.1,連線應答處理器

accpettcphandler函式是redis的連線應答處理器,用來對連線伺服器的客戶端進行應答。

當伺服器進行初始化時,程式會將這個連線應答處理器和伺服器監聽套接字的ae_readable事件關聯起來,當有客戶端用connect函式連線伺服器監聽的套接字時,套接字就會產生ae_readable事件,引發連線應答處理器執行,並執行相應的套接字應答操作。

5.2,命令請求處理器

readqueryfromclient函式是redis的命令請求處理器,用來接受客戶端傳來的命令請求。

當乙個客戶端通過連線應答處理器成功連線到伺服器後,伺服器會將客戶端套接字的ae_readable事件和命令請求處理器關聯起來,當客戶端向伺服器傳送命令請求時,套接字產生ae_readable事件,引發命令請求處理器執行,並執行相應的套接字讀入操作。

5.3,命令回覆處理器

sendreplytoclient函式是redis的命令回覆處理器,這個處理器負責將伺服器執行命令後得到的命令回覆通過套接字返回給客戶端。

當伺服器有命令回覆需要傳送給客戶端時,伺服器會將客戶端套接字的ae_writeable事件和命令回覆處理器關聯起來,當客戶端準備好接收伺服器傳回的命令回覆時,就會產生ae_writeable事件,引發命令回覆處理器執行,並執行相應的套接字寫入操作

《Redis設計與實現》之第十二章 事件

redis伺服器是乙個事件驅動程式,伺服器需要處理兩類事件 檔案事件 檔案事件就是伺服器對套接字 socket 操作的抽象,伺服器和客戶端的通訊會產生檔案事件 時間事件 時間事件就是伺服器對定時操作 比如servercron函式 的抽象,redis伺服器中的一些操作需要在給定的時間點執行 一,檔案事...

《Redis設計與實現》之第十二章 事件

redis伺服器是乙個事件驅動程式,伺服器需要處理兩類事件 檔案事件 檔案事件就是伺服器對套接字 socket 操作的抽象,伺服器和客戶端的通訊會產生檔案事件 時間事件 時間事件就是伺服器對定時操作 比如servercron函式 的抽象,redis伺服器中的一些操作需要在給定的時間點執行 一,檔案事...

第十二章 檔案

文字檔案 文字檔案是一種由若干字元構成的檔案,可以用文字編輯器進行閱讀或編輯。以txt py html等為字尾的檔案都是文字檔案。2.二進位制檔案 二進位制檔案一般是指不能用文字編輯器閱讀或編輯的檔案。以 mp4 png等為字尾的檔案都是二進位制檔案,如果想要開啟或修改這些檔案,必須通過特定軟體進行...