redis设计与实现-Reactor模型的应用

本文介绍了Redis如何实现单线程的Reactor模型,详细解析了文件事件处理器的构成,包括I/O多路复用、文件事件派发器和事件处理器。在服务启动过程中,初始化eventloop并注册事件及处理器,通过aeProcessEvents处理文件事件和时间事件。核心数据结构aeEventLoop、aeFileEvent和aeFiredEvent在事件处理中起关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.概述

Redis没有使用第三方的libevent等网络库,而是基于Reactor模式自己开发了一个单线程的Reactor模型的事件处理模型。

称为文件事件处理器,其使用I/O多路复用,同时监听多个套接字,根据套接字执行的任务来为套接字关联不同的事件处理器。

Redis在主循环中统一处理文件事件和时间事件,信号事件则由专门的handler来处理。

2.实现

分为四个部分:套接字、I/O多路复用程序、文件事件派发器、事件处理器。

I/O多路复用程序会监听多个套接字,并将所有产生事件的套接字放到一个队列中,通过队列,每次一个套接字的方式向文件事件派发器传送套接字,相应的有事件处理器处理这些套接字。
当该套接字为事件所关联的事件处理器处理完毕之后,I/O多路复用程序才会继续向文件事件派发器传送下一个套接字。

图片参考:https://www.cnblogs.com/harvyxu/p/7499396.html

2.1 服务启动过程:

2.1.1 启动redisServer(redis.c/main),在main主线程中initServer:

int main(int argc, char **argv) {

    // 初始化服务器
    initServerConfig();

    // 如果服务器以 Sentinel 模式启动,那么进行 Sentinel 功能相关的初始化
    // 并为要监视的主服务器创建一些相应的数据结构
    if (server.sentinel_mode) {
        initSentinelConfig();
        initSentinel();
    }
    // 创建并初始化服务器数据结构
    initServer();

    // 省略加载rdb、aof文件等过程

    // 运行事件处理器,一直到服务器关闭为止
    aeSetBeforeSleepProc(server.el,beforeSleep);
    aeMain(server.el);

    // 服务器关闭,停止事件循环
    aeDeleteEventLoop(server.el);

}

2.1.2 在redis.c/initServer中,初始化eventloop,并注册文件描述符事件和相关handler事件处理器:

    // 初始化EventLoop
    server.el = aeCreateEventLoop(server.maxclients+REDIS_EVENTLOOP_FDSET_INCR);

    /* Create the serverCron() time event, that's our main way to process
     * background operations. */
    // 为 serverCron() 创建时间事件
    if(aeCreateTimeEvent(server.el, 1, serverCron, NULL, NULL) == AE_ERR) {
        redisPanic("Can't create the serverCron time event.");
        exit(1);
    }

    /* Create an event handler for accepting new connections in TCP and Unix
     * domain sockets. */
    // 为 TCP 连接关联连接应答(accept)处理器
    // 用于接受并应答客户端的 connect() 调用
    for (j = 0; j < server.ipfd_count; j++) {
        if (aeCreateFileEvent(server.el, server.ipfd[j], AE_READABLE,
            acceptTcpHandler,NULL) == AE_ERR)
            {
                redis
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值