深入聊聊 Redis 的事件
良心公众号
关注不迷路
01
概述
Redis 服务器是一个事件驱动程序,需要处理两类事件:
文件事件:Redis 服务器通过套接字与外部进行连接,而文件事件就是服务器对套接字操作的抽象。服务器与外部的通信会产生相应的文件事件,服务器通过监听并处理这些事件来完成一系列网络通信操作。
时间事件:Redis 服务器中的一些操作需要在给定的时间点执行,而时间事件就是服务器对这类定时操作的抽象。
02
文件事件
Redis 基于 Reactor 模式开发了自己的网络事件处理器——文件事件处理器。
文件事件处理器使用 I/O 多路复用程序来同时监听多个套接字,并根据套接字目前执行的任务来为套接字关联不同的事件处理器。
当被监听的套接字准备好执行链接应答,读取,写入,关闭等操作时,就会产生对应的文件事件,文件事件处理器就会调用套接字之间关联好的事件处理器来处理这些事件。
文件事件处理器可以拆分为四个部分:套接字、I/O 多路复用程序、文件事件分派器、事件处理器。具体工作如下图所示:
从上图可以看出,文件事件处理器的工作流程大致可以作如下描述:I/O 多路复用程序负责监听套接字,并将其存放至队列中,然后按照有序、同步的方式逐一向文件事件分派器进行传送,文件事件分派器接收到套接字之后,会根据套接字对应的事件类型调用对应的事件处理器。
Redis 的 I/O 多路复用程序的功能,是通过封装下图所示的多种 I/O 多路复用函数库来实现的,程序在编译时会根据当前状态选择性能最高的函数库。
Redis 的文件事件分派器会遍历所有的事件,并调用相应的事件处理器来对其进行处理。
文件事件处理器可分为连接应答处理器、命令请求处理器、命令回复处理器。它们的具体作用场景如下所示:
连接应答处理器:客户端向服务端发起建立 socket 连接请求,监听套接字产生 AE_READABLE 事件,触发连接应答处理器执行。
命令请求处理器:客户端与服务器建立连接后,向服务器发送命令,客户端套接字产生 AE_READABLE 事件,触发命令请求处理器执行。
命令回复处理器:当服务器需要将命令回复回传客户端时,服务器会将客户端套接字的 AE_WRITABLE 事件和命令回复处理器作关联,客户端产生 AE_WRITABLE 事件,触发命令回复处理器执行。
上述过程可以用下图简化表示:
03
时间事件
Redis 的时间事件可分为定时事件和周期性事件,其含义如下:
定时事件:让程序在一段时间之后执行一次。
周期性事件:让程序每隔一段时间执行一次。
Redis 的一个时间事件主要由以下属性构成:
id:时间事件全局唯一的标识号,从小到大递增
when:时间事件的到达时间,毫秒精度的UNIX时间戳
timeProc:时间事件处理器,当时间事件到达时,执行该函数
服务器会将所有时间事件放入一个链表中,当时间事件执行器运行时,遍历该链表,检查事件当前是否需要执行,如需要,则调用相应的时间事件处理器。举例如下图所示:
综上所述,本文关于 Redis 事件相关的总结就到这里了。
欢迎关注【有理想的菜鸡】公众号,大家一起讨论技术,共同成长!
04
相关阅读
05
参考资料
《Redis 设计与实现》黄健宏 著
https://github.com/redis/redis
学习 | 工作 | 分享
👆关注“有理想的菜鸡”