下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

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

作者:课课家教育     来源: http://www.kokojia.com点击数:765发布时间: 2018-12-25 14:03:52

标签: 深度探索c对象模型c对象模型深度探索对象模型c

  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从网络连接上读取请求,解析出请求参数并处理。

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

赞(28)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程