天天看点

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>

继续阅读