分析Redis服务器的启动过程是什么

    作者:课课家教育更新于: 2018-12-25 11:51:51

      Redis从本质上讲是一个单进程的服务,通过一个进程对外提供请求。但是在整个redis体系中存在多个进程,一些核心操作是通过进程的方式执行的。比如核心的接受客户端命令执行相应操作是一个单独的进程在执行;一些log的写入是一个进程等。这篇文章不对这个多进程的执行方式详细展开,主要是对redis中启动过程中都执行了什么操作进行一个梳理。

      redis的启动入口是在redis.c中,在redis.c中可以看到main函数,这就是redis的启动的入口。所有代码分析都是从这里展开的。redis在启动过程中其实可以归结为几大操作,初始化配置文件,初始化redis支持的命令、初始化服务器。其中核心操作是在初始化服务器里面,包括socket监听、各种监听事件的建立等。

      在redis.c的main函数,主要做三件事情:

      1)加载配置包括从命令行或者传入配置文件加载;

      2)启动Unix和tcp的监听,客户端的列表保存在redisserver的clients中;

      3)启动AE事件。

      启动完成,AE会定时间去查询各个客户端是否有输入,如果有读取客户端输入并且对命令进行解析。

      首先,我们先来看一张图:

      以上图片是initServer()和aeMain()函数的深度探索c,执行流程图,带颜色的函数是比较重要的函数

         下面是Redis启动具体流程:

      1.准备运行环境

      *设置oomhandler,zmalloc分配内存失败时调用

      *初始化随机种子,用于生成随机数

      *将server参数初始化为默认值

      *创建命令与处理函数的映射表

      2.解析命令行参数、loadServerConfig()解析配置文件

      *配置文件会覆盖命令行指定的参数

      *无效的配置项或者不合理的配置值会导致redis无法正常启动

      3.initServer()初始化服务

      *安装信号处理函数

      *创建共享对象,redis预分配好常用的对象用于共享,以节省内存

      *根据maxclients配置调整maxopenfiles

      *创建全局db字典,每个db对应一个dict

      *监听网络端口,安装事件处理器

      *如果开启了aof,打开aof文件

      *创建serverCron定时器

      4.loadDataFromDisk()从rdb或aof文件加载数据

      *load数据出错(比如文件格式乱掉)等会导致redis不能正常启动

      *loading的过程中,redis仍能处理请求,但大部分请求都会回复-LOADING错误

      5.aeMain()开始事件循环,接收客户端请求

      监听文件描述符的事件处理函数初始化为acceptTcpHandler,新建立的连接的事件处理函数设置为readQueryFromClient,readQueryFromClient从网络连接上读取请求,解析出请求参数并处理。

      今天的内容讲到这边结束了,大家对此处学习了解多少,我们明天见。更多内容尽在课课家教育!

课课家教育

未登录