redis 之网络模型
来源:互联网 发布:南京软件测试薪资 编辑:程序博客网 时间:2024/05/21 17:21
redis的网络模型处理的fd必须小于2048(在events结构体中放不下);
/* 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;
/* File event structure */
typedef struct aeFileEvent {
int mask; /* one of AE_(READABLE|WRITABLE) */
aeFileProc *rfileProc;
aeFileProc *wfileProc;
void *clientData;
} aeFileEvent;
typedef void aeFileProc(struct aeEventLoop *eventLoop, int fd, void *clientData, int mask);
/* A fired event */
typedef struct aeFiredEvent {
int fd;
int mask;
} 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;
- redis 之网络模型
- redis之 网络模型,acceptTcpHandler,readQueryFromClient,bio
- Redis 网络架构及单线程模型
- Redis 网络架构及单线程模型
- redis源码阅读(1):redis服务网络模型
- 网络编程模型综述 之 多线程模型
- memcached分析之网络模型
- caffe之绘制网络模型
- 网络的那些事之网络模型
- 网络编程模型综述 之 UNIX网络I/O模型
- redis源码分析(1) 服务端网络链接模型
- 网络基础之网络参考模型 + 网络协议
- Redis源码学习之【网络通信框架】
- Redis源码学习之【网络通信框架】
- 系统设计之 网络模型(二)
- 技术系列之 网络模型(二)
- 系统设计之 网络模型(二)
- 技术系列之 网络模型(二)
- vs中 未能找到元数据文件错误
- jsoup select 选择器
- 利用Java编写简单的WebService实例
- wubi的错
- What is Augmented Reality(AR)
- redis 之网络模型
- UML类图详解
- Python连接mysql
- 调用第三方获取两点坐标距离
- 链接openssl静态库时遇到的问题(
- 对称多处理SMP
- Java正则表达式入门
- iOS 静态类库项目的建立与使用
- javascript == 判断老是出错