#define ae_setsize (1024*10) /* max number of fd supported */
redis的網路模型處理的fd必須小於2048(在events結構體中放不下);
/* state of an event based program */
typedef struct aeeventloop aeeventloop;
/* file event structure */
typedef struct aefileevent aefileevent;
typedef void aefileproc(struct aeeventloop *eventloop, int fd, void *clientdata, int mask);
/* a fired event */
typedef struct aefiredevent aefiredevent;
int aecreatefileevent(aeeventloop *eventloop, int fd, int mask, aefileproc *proc, void *clientdata);
void aedeletefileevent(aeeventloop *eventloop, int fd, int mask);
將fd交給eventloop託管,直接通過aeeventloop.events[fd]找到託管aefileevent;
每個fd關聯乙個mask(託管事件readable or writable),讀函式(可讀時呼叫)和寫函式(可寫時呼叫),以及clientdata(傳給讀寫函式);
aefireevent類似epoll的epoll_event;
首先,通過epoll_wait拿到events,再轉存到fired陣列中;
通過fired陣列中的fd找到託管的aefileevent,獲得讀函式、寫函式及clientdata,然後,根據fired陣列中的mask呼叫讀寫函式;
之所以引入aefireevent,是因為redis的網路模型不僅僅支援epoll,還支援select和kqueue,需要乙個中間抽象層;
除了託管fd外,還支援timer,timer都儲存在鍊錶timeeventhead,每輪poll後,會check一下timer;
網路的那些事之網路模型
說到網路就不能不說說網路模型,它是網路技術的基礎,也是分析 評判各種網路技術的依據。當前存在兩種網路模型 ios osi參考模型和tcp ip協議。雖然osi參考模型的實際應用意義不是很大,但其對於理解網路協議內部的運作很有幫助。一 osi的概念 osi參考模型 osi rm 的全稱是開放系統互聯參...
Redis之資料庫空間模型
在關係型資料庫如mysql,資料庫資料是按照行記錄格式進行儲存的。同理,我們常說redis是乙個鍵值對 key value 構成的記憶體資料庫,具體是以什麼形式進行儲存的,下面通過原始碼一看究竟。在redis.h redisserver中記錄了乙個由redis.h redisdb結構組成的陣列,這裡...
OSI模型之網路層概述
網路層所處的位置是模型的第三層,第三層的功能和任務是實現資料分組從源主機傳送到目的主機,網路層是實現網路的基礎。在tcp ip模型中,ip協議實現了各種異構網路的互聯,從而向上一層傳輸透明的 跟異構網路無關的 與硬體無關的資料報。實現異構網路互聯的網路裝置就是路由器。那麼資料分組是如何穿過網路從源主...