关闭

redis学习笔记->事件处理流程

126人阅读 评论(0) 收藏 举报

最近开始学习redis源码,记录一下

一、涉及的函数

(省略了大量函数)

redis的main函数在redis.c文件里,在main函数里,initServerConfig()函数设置全局变量server的每项默认值,之后main函数在检查程序参数,根据参数读取相关配置修改server配置,server定义如下:

struct redisServer server;

接下来,initServer()函数会做服务器初始化工作,包括创建相关数据结构,打开监听端口,设置事件循环等等

最后aeMain()会启动事件循环,服务器开始处理事件,服务器退出后,调用aeDeleteEventLoop()摧毁事件循环。

二、相关初始化工作

在initServer()函数内:

初始化相关数据结构

server.clients = listCreate();
server.clients_to_close = listCreate();
server.slaves = listCreate();

//创建事件循环,接下里服务器处理事件将会围绕这个循环,即EventLoop,同时调用aeApiCreate()创建IO多路复用的实例,例如epoll实例
server.el = aeCreateEventLoop(server.maxclients+REDIS_EVENTLOOP_FDSET_INCR);

接下来,程序打开监听端口,用于等待客户端的命令

    if (server.port != 0 &&
        listenToPort(server.port,server.ipfd,&server.ipfd_count) == REDIS_ERR)
        exit(1);
然后,会为serverCron()函数创建时间事件,为监听端口上的套接字创建文件事件,函数为acceptTcpHandler()

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. */
    for (j = 0; j < server.ipfd_count; j++) {
        if (aeCreateFileEvent(server.el, server.ipfd[j], AE_READABLE,
            acceptTcpHandler,NULL) == AE_ERR)
            {
                redisPanic(
                    "Unrecoverable error creating server.ipfd file event.");
            }
    }


在aeCreateTimeEvent()函数内,创建好的时间事件结构体aeTimeEvent *te会被放入事件循环server.el中的时间事件链表表头上,并设置事件处理函数te->timeProc = proc。
在aeCreateFileEvent()函数内,设置该文件事件的mask,并注册到IO多路复用的监听中。并设置事件处理函数fe->rfileProc = proc;fe->wfileProc = proc;


三、开始处理事件

aeMain代码如下:

void aeMain(aeEventLoop *eventLoop) {

    eventLoop->stop = 0;

    while (!eventLoop->stop) {

        // 如果有需要在事件处理前执行的函数,那么运行它
        if (eventLoop->beforesleep != NULL)
            eventLoop->beforesleep(eventLoop);

        // 开始处理事件
        aeProcessEvents(eventLoop, AE_ALL_EVENTS);
    }
}

在aeProcessEvents()函数里

先检查最近的时间事件,检查事件到达时间,计算出IO多路复用实例(如epoll)一次等待的时间。

如果时间事件已经到达,则设置epoll等待时间为0,立刻返回,如果不是立刻到达,则计算出时间差,时间差为epoll_wait的等待时间

然后程序已经到达的文件事件,并调用他们事件处理函数。

处理完文件事件后,处理时间事件。


四、处理用户命令流程

监听套接字接到一个新用户连接时,调用acceptTcpHandler为客户端创建redisClient。并添加到服务器的客户端链表中,同时为这个连接添加事件到事件循环。

redisClient *createClient(int fd) {
aeCreateFileEvent(server.el,fd,AE_READABLE,
            readQueryFromClient, c)
listAddNodeTail(server.clients,c);
}
当用户传命令到服务器时,readQueryFromClient就会被调用,处理用户命令


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

深入剖析 redis 事件驱动

2014-03-09 15:28 by 捣乱小子, 5947 阅读, 2 评论, 收藏, 编辑 概述 redis 内部有一个小型的事件驱动,它和 libevent 网络库的事件驱动一样...
  • huangyimo
  • huangyimo
  • 2016-10-10 15:48
  • 1191

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

Redis中,处理网络IO时,采用的是事件驱动机制。但它没有使用libevent或者libev这样的库,而是自己实现了一个非常简单明了的事件驱动库ae_event,主要代码仅仅400行左右。     ...
  • gqtcgq
  • gqtcgq
  • 2016-04-03 10:55
  • 1608

Redis AE 异步事件模块

首先想一个问题,为何Redis比Memcached快呢? 一般想法:Memcached完全基于内存,而Redis具有持久化保存特性,即使是异步的,Redis也不可能比Memcached快。 可实际...
  • andyhuabing
  • andyhuabing
  • 2016-09-18 14:50
  • 1648

Redis 事件(2) -- 时间事件

Redis时间事件分为以下两类:  1.定时事件:程序在指定时间执行一次。  2.周期性事件:程序每隔指定时间执行一次。  时间事件的属性: 1.id:服务器为时间事件创建的全局唯一I...
  • Focus_zhu
  • Focus_zhu
  • 2015-07-12 22:13
  • 652

Redis源码剖析和注释(十九)--- Redis 事件处理实现

Redis 事件处理实现1. Redis事件介绍Redis服务器是一个事件驱动程序。下面先来简单介绍什么是事件驱动。所谓事件驱动,就是当你输入一条命令并且按下回车,然后消息被组装成Redis协议的格式...
  • men_wen
  • men_wen
  • 2017-05-10 09:47
  • 1493

redis源码分析(2)——事件循环

redis源码分析,介绍事件循环的实现
  • chosen0ne
  • chosen0ne
  • 2015-01-14 21:51
  • 3494

redis时间事件

数据结构文件:ae.h时间事件的三个属性: when :以毫秒格式的 UNIX 时间戳为单位,记录了应该在什么时间点执行事件处理函数。 timeProc :事件处理函数。 next 指向下一个时间事件...
  • huyangyamin
  • huyangyamin
  • 2015-07-15 16:47
  • 456

Redis 事件(1) -- 文件事件

Redis 服务器是一个事件驱动程序,服务器需要处理以下两类事件: 1)文件事件 Redis服务器通过套接字与客户端(或其他Redis服务器)进行连接,而文件时间就是服务器对套接字操作的抽象。服务器与...
  • Focus_zhu
  • Focus_zhu
  • 2015-07-11 21:52
  • 685

redis事件机制

redis并没有采用libevent库作为事件机制的底层实现,而是自己对io多路复用进行了封装,即可以采用select、epoll、evport、kqueue作为底层的实现。 redis客户端与服务端...
  • ApeLife
  • ApeLife
  • 2016-03-19 20:02
  • 590

架构设计:系统存储(16)——Redis事件订阅和持久化存储

在本专题讨论Redis时,会首先花一些较少的篇幅介绍Redis的基本安装和使用,然后将深入Redis所支持的数据结构主要讲解Redis底层设计对这些数据结构的支撑,接下来会介绍Redis的主要配置优化...
  • yinwenjie
  • yinwenjie
  • 2016-12-13 11:14
  • 6147
    个人资料
    • 访问:365次
    • 积分:25
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档