Redis(五):Redis的事件循环

本文深入剖析了Redis服务器的事件循环机制,包括事件循环主流程、连接事件处理器、可读和可写事件处理器、每次事件循环回调函数以及时间事件处理器。详细阐述了客户端连接创建、命令解析与执行、回复写回以及内存管理和持久化操作等关键步骤,揭示了Redis高效处理客户端请求的内部逻辑。
摘要由CSDN通过智能技术生成

   上一篇博客中介绍了Redis 服务器的初始化流程,而这一节中我们来介绍Redis事件循环的主流程。

1. 事件循环主流程(aeMain)

2. 创建连接事件处理器(acceptTcpHandler)

3. 可读事件处理器(readQueryFromClient)

4. 可写事件处理器(sendReplyToClient)

5. 每次事件循环回调(beforeSleep)

6. 时间事件处理器(serverCron)


1. 事件循环主流程(aeMain)

      redis是一个事件驱动程序,服务器需要处理以下两类事件,分别是时间事件和文件事件。redis服务器在启动之后,开始执行事件循环,就可以接受客户端的连接请求并处理客户端发来的命令请求了。一图胜千言,事件循环的流程如下图所示(基于redis 3.0 版本):

        

(1)事件循环中,每次迭代都需要执行一次beforeSleep回调函数;

(2)事件循环开始时,首先需要计算最近的时间事件的timeout,然后把这个timeout作为epoll_wait的参数传入,等待文件事件的发生;

(3)如果没有文件事件发生,则执行时间事件,然后进入到下一轮事件循环;

(4)如果有文件事件发生,则根据文件事件是否可读和可写,调用相应的事件处理器:

  • 在事件可读时,如果是监听端口产生的,则需要调用acceptTcpHandler函数创建一个新的客户端连接,并且把新创建的socket的可读事件加入到epoll的监听队列中,并且注册相应的可读事件回调函数readQueryFromClient。
  • 事件可读时,如果可读事件是其它端口产生的,则调用readQueryFromClient函数处理客户端的命令请求,处理完成之后把该socket的可写事件加入到epoll的监听队列中,并且注册相应的可写事件回调函数sendReplyToClient。
  • 事件可写时,需要调用sendReplyToClient函数把写回缓冲区中的内容写到socket中,并且删除该socket的可写事件在epoll中的监听。

    整个事件循环中,有几个函数非常关键,分别是创建连接的事件处理器、可读文件事件处理器、可写文件事件处理器、每次事件循环的回调函数和时间事件处理函数,下面分别进行介绍。

2. 创建连接事件处理器(acceptTcpHandler)

    在redis服务器初始化的时候,会为监听端口server.port创建一个socket,并且将这个socket的可读事件加入到epoll的监听队列中,而且为这个socket的可读事件注册回调函数acceptTcpHandler,当在事件循环中检测到该端口可读时,就会调用acceptTcpHandler对该socket进行处理。acceptTcpHandler的功能如下:

        

(1)这个函数主要功能是从TCP的已连接队列中取出已经建立TCP三次握手的socketfd,因此这里循环调用了1000次,为的就是一次性尽可能多的取出已经建立的客户端连接。

(2)接着需要为已建立的连接创建一个redisClient,接着设置这个建立的socket fd为非阻塞模式,禁用Nagle算法,设置keep alive,注册连接的socket fd读回调函数readQueryFromClient,并把fd可读事件加入epoll的监听。

(3)最后再初始化redisClient结构体中的其它属性值,然后把这个结构体添加到server.clients的链表中

(4)如果创建的客户端的数量超过了服务器的最大客户端数量server.maxclients,则向这个socket fd写回错误信息,并且释放这个redisClient。

3. 可读事件处理器(readQueryFromClient

    在acceptTcpHandler函数中创建一个新的socket fd时,会将readQueryFromClient函数注册给socket fd的可读事件,当在事件循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值