为什么我说 C/C++ 程序员都要阅读 Redis 源码
主要原因就是『简洁』. 如果你用源码编译过 Redis, 你会发现十分轻快, 一步到位. 其他语言的开发者可能不会了解这种痛, 作为 C/C++ 程序员, 如果你源码编译安装过 Nginx/Grpc/Thrift/Boost 等开源产品, 你会发现有很多依赖, 而依赖本身又有依赖, 十分痛苦. 通常半天一天就耗进去了. 由衷地羡慕 NPM/maven/pip/Composer/... 这些包管理器. 而 Redis 则给人惊喜, 一行 make 了此残生.
除了安装过程简洁, 代码也十分简洁. 使用纯 C 语言编写, 每个模块功能都划分的很清晰.
废话不多说, 本文要介绍的是 Redis 里的事件处理功能, 与 Memcache 引入 libevent 这一臃肿的事件库不同, Redis 自己实现了一个小型轻量的事件驱动库 --AE. 阅读它的源码是一次非常好的学习和体验.
- #ifdef HAVE_EVPORT
- #include "ae_evport.c"
- #else
- #ifdef HAVE_EPOLL
- #include "ae_epoll.c"
- #else
- #ifdef HAVE_KQUEUE
- #include "ae_kqueue.c"
- #else
- #include "ae_select.c"
- #endif
- #endif
- #endif
- aeCreateEventLoop
- aeSetBeforeSleepProc
- aeMain
- aeDeleteEventLoop
- typedef struct aeEventLoop {
- int maxfd; / 当前注册的最大 fd/
- int setsize; / 监视的 fd 的最大数量 /
- long long timeEventNextId; / 下一个时间事件的 ID/
- time_t lastTime; / 上次时间事件处理时间 /
- aeFileEvent events; / 已注册文件事件数组 /
- aeFiredEventfired; / 就绪的文件事件数组 /
- aeTimeEvent timeEventHead; / 时间事件链表的头 /
- int stop; / 是否停止(0: 否; 1: 是)/
- voidapidata; / 各平台 polling API 所需的特定数据 /
- aeBeforeSleepProc beforesleep; / 事件循环休眠开始的处理函数 /
- aeBeforeSleepProcaftersleep; / 事件循环休眠结束的处理函数 /
- } aeEventLoop;
- typedef struct aeFileEvent {
- int mask; /one of AE_(READABLE|WRITABLE|BARRIER)/
- aeFileProc rfileProc;
- aeFileProcwfileProc;
- void *clientData;
- } aeFileEvent;
- typedef struct aeFiredEvent {
- int fd;
- int mask;
- } aeFiredEvent;
- typedef struct aeTimeEvent {
- long long id; /time event identifier./
- long when_sec; /seconds/
- long when_ms; /milliseconds/
- aeTimeProc timeProc;
- aeEventFinalizerProcfinalizerProc;
- void clientData;
- struct aeTimeEventprev;
- struct aeTimeEvent *next;
- } aeTimeEvent;
- ae.c
- aeCreateEventLoop
- aeApiCreate
- aeResizeSetSize
- aeApiResize
- aeDeleteEventLoop
- aeApiFree
- aeCreateFileEvent
- aeApiAddEvent
- aeDeleteFileEvent
- aeApiDelEvent
- aeProcessEvent
- aeApiPoll
- aeGetApiName
- aeApiName
- /* A simple event-driven programming library. Originally I wrote this code
- for the Jim's event-loop (Jim is a Tcl interpreter) but later translated
- it in form of a library for easy reuse.
来源: http://www.bubuko.com/infodetail-3122090.html