天天看點

Redis代碼閱讀3--Redis網絡監聽(1)



接下來的三篇文章将對Redis的網絡監聽流程及涉及到事件庫和各個主要方法進行介紹。

在介紹 redis的網絡監聽流程和事件庫之前,我們先設想一下,如果我們不采用

在我認為,需要考慮的問題有以下一些(限于水準,暫時隻能想到這些

Redis代碼閱讀3--Redis網絡監聽(1)

):

1.  

采用何種 事件觸發機制 ,是 epoll, select, kquque,抑或 3種都支援

2.  

支援那些事件?

3.  

如何管理各種事件(資料結構 —響應,查找)?

4.  

如何響應 I/O事件?是異步還是同步?是單線程響應還是多線程響應?

5.  

如何盡快地響應各種事件?

Redis的作者沒有采用 libevent等之類的知名網絡庫,而是通過少量的代碼實作了一個基于反轉模式的輕量級網絡庫,對于這一點, Redis的作者是這樣解釋的,因為他覺得 libevent之類的知名網絡庫太過于龐大,而對 Redis來說隻需要異步監聽的基本功能,是以他不想引入過于“龐大”的第三庫。

首先我們從 ae.h檔案開始,介紹一下 redis網絡監聽所涉及的幾個結構體和方法

Redis代碼閱讀3--Redis網絡監聽(1)

/* A fired event */  

typedef struct aeFiredEvent {  

    int fd;  

    int mask;  

} aeFiredEvent;  

/* State of an event based program */  

typedef struct aeEventLoop {  

    int maxfd;  

    long long timeEventNextId;  

    aeFileEvent events[AE_SETSIZE]; /* Registered events */  

    aeFiredEvent fired[AE_SETSIZE]; /* Fired events */  

    aeTimeEvent *timeEventHead;  

    int stop;  

    void *apidata; /* This is used for polling API specific data */  

    aeBeforeSleepProc *beforesleep;  

} aeEventLoop;  

aeFileEvent是檔案讀寫事件的抽象

Redis代碼閱讀3--Redis網絡監聽(1)

/* File event structure */  

typedef struct aeFileEvent {  

    int mask; /* one of AE_(READABLE|WRITABLE) */用來區分讀寫事件  

    aeFileProc *rfileProc;   讀檔案事件的處理函數  

    aeFileProc *wfileProc;  寫檔案事件的處理函數  

    void *clientData;  

} aeFileEvent;  

aeTimeEvent則是定時響應的事件的抽象  

/* Time event structure */  

typedef struct aeTimeEvent {  

    long long id; /* time event identifier. */  

    long when_sec; /* seconds */  事件響應點的秒時刻  

    long when_ms; /* milliseconds */事件響應的毫秒時刻  

    aeTimeProc *timeProc;  事件響應函數  

    aeEventFinalizerProc *finalizerProc;  

    struct aeTimeEvent *next;  下一個要響應的時間事件  

} aeTimeEvent  

Redis代碼閱讀3--Redis網絡監聽(1)

在了解了 Redis基于事件驅動的網絡庫所涉及的三個基本元件後,我們來看一下 Redis的網絡監聽的基本流程:

Redis代碼閱讀3--Redis網絡監聽(1)

<a href="http://olylakers.iteye.com/blog/1287211">接下來下一篇文章将介紹整個流程涉及到的具體方法</a>

繼續閱讀