redis的文件事件处理器

前言

C10K problem提出了一个问题,如果1w个客户端连接到server上,间歇性的发送消息,有哪些好的方案?

其中的一种方案是,每个线程处理多个客户端,使用异步I/O和就绪通知机制,redis无疑是一个很好的榜样

redis的特点和C10K proble的契合点

内存数据库;

单线程支持上w个客户端连接;

高并发,单机支持10w并发数;

低时延,局域网内大多数时延低于3ms。

redis的文件事件处理器

四个关键组成

套接字、I/O多路复用、文件事件分发器、事件处理器。

这是一个典型的reactor设计模式,redis没有采用现有的事件驱动库,比如libev等,而是自己定义了一个ae驱动器。

使用epoll同时监听多个套接字,并给不同套接字关联不同的处理程序。

当被监听的套接字准备好连接应答、请求、应答、关闭等操作时,对应的文件事件就会产生,文件事件处理器会调用对应的处理程序。

I/O多路复用和文件事件分派器的实现

epollI/O多路复用的封装

ae_epoll.c

创建epoll实例和事件槽

aeApiCreate

释放epoll实例和事件槽

aeApiFree

给fd新增或者修改关注事件

aeApiAddEvent

删除fd关注的事件

aeApiDelEvent

获取可执行事件

aeApiPoll

ae.h

文件事件处理器的实例

typedef struct aeEventLoop {

// 目前已注册的最大描述符

int maxfd;   /* highest file descriptor currently registered */

// 目前已追踪的最大描述符

int setsize; /* max number of file descriptors tracked */

// 用于生成时间事件 id

long long timeEventNextId;

// 最后一次执行时间事件的时间

time_t lastTime;     /* Used to detect system clock skew */

// 已注册的文件事件

aeFileEvent *events; /* Registered events */

// 已就绪的文件事件

aeFiredEvent *fired; /* Fired events */

// 时间事件

aeTimeEvent *timeEventHead;

// 事件处理器的开关

int stop;

// 多路复用库的私有数据

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

// 在处理事件前要执行的函数

aeBeforeSleepProc *beforesleep;

} aeEventLoop;

文件事件处理器以及文件事件分派器的实现

ae.c

初始化文件事件处理器

aeCreateEventLoop

删除事件处理器

aeDeleteEventLoop

停止事件处理器

aeStop

创建文件事件处理器

aeCreateFileEvent

删除文件事件处理器

aeDeleteFileEvent

获取监听的事件类型

aeGetFileEvents

文件事件分派器,调用aePoll获取激活的事件,并调用事件对应的文件处理器来处理这些事件

aeProcessEvents


redis的I/O事件处理器

创建连接处理程序

aeCreateFileEvent(server.el, server.ipfd[j], AE_READABLE, acceptTcpHandler,NULL)

创建请求处理程序

aeCreateFileEvent(server.el,fd,AE_READABLE, readQueryFromClient, c)

创建应答处理程序,当命令回复完毕,解除套接字和事件的关联

aeCreateFileEvent(server.el, c->fd, AE_WRITABLE, sendReplyToClient, c)

ae驱动的事件类型

// 可读

#define AE_READABLE 1

// 可写

#define AE_WRITABLE 2

当客户端发起连接、断开连接、发送请求时,套接字产生AE_READABLE事件

当套接字变得可写(客户端调用read操作)时,套接字产生AE_WRITABLE事件。

ae驱动的事件处理顺序

ae驱动允许同时监听可读和可写事件,同时发生时先处理可读事件,再处理可写事件。

时间: 2024-12-29 23:47:37

redis的文件事件处理器的相关文章

Reactor事件模型在Redis中的应用

1 模型简介 Redis没有使用第三方的libevent等网络库,而是自己开发了一个单线程的Reactor模型的事件处理模型.而Memcached内部使用的libevent库,多线程模型. 综合对比可见:nginx,memcached,redis网络模型总结 Redis在主循环中统一处理文件事件和时间事件,信号事件则由专门的handler来处理. 文件事件,我理解为IO事件,Redis将产生事件套接字放入一个就绪队列中,即redisServer.aeEventLoop.fired数组,然后在ae

redis 笔记03

RDB 持久化 1. RDB文件用于保存和还原Redis服务器所有数据库中的所有键值对数据. 2. SAVE命令由服务器进程直接执行保存操作,所以该命令会阻塞服务器. 3. BGSAVE令由子进程执行保存操作,所以该命令不会阻塞服务器. 4. 服务器状态中会保存所有用save选项设置的保存条件,当任意一个保存条件被满足时,服务器就自动执行BGSAVE命令. 5. RDB文件是一个经过压缩的二进制文件,由多个部分组成. 6. 对于不同类型的键值对,RDB文件会使用不同的方式来保存它们. 7. Re

文件事件 时间事件

redis是一个事件驱动程序 主要包含 文件事件和时间事件 文件事件:主要就是server和client进行操作产生的文件 时间事件:主要就是一些需要定时执行的事件. 文件事件: 文件事件处理器是单线程运行的,但是通过IO多路复用,可以处理多个套接字 下面是文件事件处理器的结构 文件事件处理器主要是上面四个部分构成的 文件事件其实就是对套接字操作的抽象,我们当执行读写的时候就会产生,因为文件事件处理器可以连接多个套接字,所以可能多个文件事件同时发生,但是IO多路程序会将这些文件事件都放在一个队列

Redis设计与实现-客户端服务端与事件

事件 redis服务器是事件驱动的,事件分为文件事件与时间事件 文件事件是服务器通过套接字与客户端连接,两者之间的通信会产生相应的文件事件,服务器监听并处理这些事件完成网络操作: 时间事件是指redis服务器的定时操作 redis基于reactor模式的文件事件处理器以单线程方式运行,并使用I/O多路复用程序来监听多个套接字,并根据套接字目前执行的任务来为套接字关联不同的事件处理器.: 文件事件处理器由四部分组成: 套接字 I/O多路复用程序:监听多个套接字产生的文件事件并放到一个队列,然后以有

学习笔记-Redis设计与实现-事件

Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件: 文件事件(file event):Redis服务器通过套接字与客户端(或者其他Redis服务器)进行连接,而文件事件就是服务器对套接字操作的抽象. 时间事件(time event):Redis服务器中的一些操作(比如serverCron函数)需要在给定的时间点执行,而时间事件就是服务器对这类定时操作的抽象. 12.1 文件事件 Redis基于Reactor模式开发了自己的网络事件处理器,被称为文件事件处理器(file event

redis学习笔记——命令执行流程

基础知识部分 如果需要掌握Redis的整个命令的执行过程,那么必须掌握一些基本的概念!否则根本看不懂,下面我就一些在我看来必备的基础知识进行总结,希望能为后面命令的整个执行过程做铺垫. 事件 Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件: 文件事件(file event):Redis服务器通过套接字与客户端(或者其他Redis服务器)进行连接,而文件事件就是服务器对套接字操作的抽象.服务器与客户端(或者其他服务器)的通信会产生相应的文件事件,而服务器则通过监听并处理这些事件来完

Redis源码解析:14Redis服务器与客户端间的交互

Redis服务器是典型的一对多服务器程序,通过使用由IO多路复用技术实现的文件事件处理器,Redis服务器使用单线程单进程的方式来处理命令请求,并与多个客户端进行网络通信. Redis客户端与服务器之间通过TCP协议进行通信.TCP协议是一种流式协议,数据以字节流的形式进行传递,没有固有的"报文"或"报文边界"的概念,如果需要设置边界,需要应用层自行处理. 因此,Redis客户端与服务器之间的交互数据,都按照Redis自定义的统一请求协议的格式进行编码.使用这种协议

Redis源码解析:13Redis中的事件驱动机制

Redis中,处理网络IO时,采用的是事件驱动机制.但它没有使用libevent或者libev这样的库,而是自己实现了一个非常简单明了的事件驱动库ae_event,主要代码仅仅400行左右. 没有选择libevent或libev的原因大概在于,这些库为了迎合通用性造成代码庞大,而且其中的很多功能,比如监控子进程,复杂的定时器等,这些都不是Redis所需要的. Redis中的事件驱动库只关注网络IO,以及定时器.该事件库处理下面两类事件: a:文件事件(file  event):用于处理Redis

redis学习笔记——事件处理

Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件: 文件事件(file event):Redis服务器通过套接字与客户端(或者其他Redis服务器)进行连接,而文件事件就是服务器对套接字操作的抽象.服务器与客户端(或者其他服务器)的通信会产生相应的文件事件,而服务器则通过监听并处理这些事件来完成一系列网络通信操作: 时间事件(time event):Redis服务器中的一些操作(比如serverCron函数)需要在给定的时间点执行,而时间事件就是服务器对这类定时操作的抽象. 文件事