直奔主题,当启动Redis的时候,Redis执行了哪些操作?

假设Redis安装在了/usr/local/目录下,那么启动Redis是通过执行/usr/local/bin/redis-server -c xxx.conf的方式执行。 redis-server是一个通过编译server.c文件生成的程序,因此想了解redis是怎么启动的,应该从server.c/main函数入手。

具体代码可见:server.c

阅读main函数,可以知道,整个启动大致分为五个步骤:初始化server结构体、从配置文件夹在加载参数、初始化服务器、载入持久化文件、开始监听事件。

redis用redisServer结构体来保存服务器的属性和信息,在server.c文件中,定义了一个全局服务器变量:

struct redisServer server;

另外,还定义了一个redis命令表,表里包含了命令以及命令对应的函数:

struct redisCommand redisCommandTable;

在main函数里,redis先调用initServerConfig函数初始化server结构体。

初始化server结构体

main函数调用initServerConfig函数为server的属性设置一些默认值,比如:

服务器的运行ID

redis使用的默认端口号,是在server.h定义的CONFIG_DEFAULT_SERVER_PORT = 6379

LRU时钟

主从备份相关参数

命令表

慢查询参数

接着会保存当前执行的路径和参数,为之后的服务器重启使用相同的参数做准备:

server.executable = getAbsolutePath(argv[0]);
server.exec_argv = zmalloc(sizeof(char*)*(argc+1));
server.exec_argv[argc] = NULL;
for (j = 0; j < argc; j++) server.exec_argv[j] = zstrdup(argv[j]);

从配置文件加载参数

redis的启动参数有很多,其中一个是指定配置文件。初始化server结构体后,大部分的属性都会设置到结构体了,但是有部分参数可以通过配置文件重现设置,比如redis的端口号。

初始化完server结构体后,函数会判断是否有指定配置文件,如果有,调用loadServerConfig函数,从配置文件加载相关的配置,把配置文件对应的参数设置到server结构体。

读取配置文件加载参数的流程如下:

  • 1、分割参数项
  • 2、跳过空行和注释行
  • 3、逐项检查,如果参数合法,设置配置值到server属性

至此,redisServer大部分属性已经设置好,server还有很多数据结构没有初始化,initServer函数就继续接下来的初始化工作。

初始化服务器数据结构

main函数会调用initServer函数初始化服务器状态,比如:

进程ID

客户端链表

从库链表

为常用值创建共享对象

初始化事件循环器

打开TCP开始监听套接字

创建服务器的数据库,并初始化内部状态

为serverCron定时器创建时间事件定时器

如果开启了AOF,打开AOF文件,之后恢复数据时需要用到

初始化慢查询日志模块

初始化后台IO模块

载入持久化文件,还原数据库

初始化完服务器的状态后,服务器已经处于一个可启动状态,因为redis有持久化特性,服务器还需要加载相应的文件来还原之前数据库的数据。 判断Redis当前开启了哪种模式,如果是AOF,则通过AOF还原数据库的数据,否则,载入RDB文件,通过RDB文件还原数据库的数据。

开始监听事件

main函数会设置beforeSleep和afterSleep回调函数,然后调用aeMain函数启动事件循环器,开始监听事件。aeMain函数是一个死循环,不断的监听新请求的到来。

/*
* server启动后,main函数的最终步骤,不断地调用beforesleep和aeProcessEvents
*/
void aeMain(aeEventLoop *eventLoop) {
eventLoop->stop = 0;
while (!eventLoop->stop) {
if (eventLoop->beforesleep != NULL)
eventLoop->beforesleep(eventLoop);
aeProcessEvents(eventLoop, AE_ALL_EVENTS|AE_CALL_AFTER_SLEEP);
}
}

综上所述,服务器整个启动简化流程图如下:

当你启动Redis的时候,Redis做了什么的更多相关文章

  1. Redis : 为什么我们做分布式使用 Redis ?(转)

    绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只会 Set Value 和 Get Value 两个操作,对 Redis 整体缺乏一个认知.这里对 Redis 常见问题做一个总结,解决 ...

  2. Linux Redis自动启动,Redis开机启动,Linux Redis设置开机启动

    Linux Redis自动启动,Redis开机启动,Linux Redis设置开机启动 >>>>>>>>>>>>>> ...

  3. [redis] mac下redis安装、设置、启动停止

    From: https://www.cnblogs.com/shoren/p/redis.html 下载安装 需要下载release版本,下载地址: http://download.redis.io/ ...

  4. Linux Redis安装,Linux如何安装Redis,Linux Redis自动启动,Redis开机启动

    Linux Redis安装,Linux如何安装Redis,Linux Redis自动启动,Redis开机启动 >>>>>>>>>>>& ...

  5. devilbox(三):在docker中启动带密码的redis数据库

    背景概述: 之前是使用docker搭建了一套集成的开发环境devilbox,也说了这个环境可以自定义.其实搭建这个环境一是为了练习docker使用,二是搭建我们测试环境,主要用到各种数据库,然而安装教 ...

  6. LogStash启动报错:<Redis::CommandError: ERR unknown command 'script'>与batch_count 的 配置

    环境条件: 系统版本:centos 6.8 logstash版本:6.3.2 redis版本:2.4 logstash  input配置: input { redis { host => &qu ...

  7. 【docker】【redis】2.docker上设置redis集群---Redis Cluster部署【集群服务】【解决在docker中redis启动后,状态为Restarting,日志报错:Configured to not listen anywhere, exiting.问题】【Waiting for the cluster to join...问题】

    参考地址:https://www.cnblogs.com/zhoujinyi/p/6477133.html https://www.cnblogs.com/cxbhakim/p/9151720.htm ...

  8. [Redis]windows下redis的安装和启动

    官方的下载地址是: http://redis.io/download 在win64一栏中能够看到redis原本是没有windows版本号的,windows版本号是Microsoft Open Tech ...

  9. 二、Redis启动、停止、Redis命令行的操作

    1.redis命令 redis执行了make install后,redis的课执行文件都会自动复制到 /usr/local/bin 目录 redis-server redis服务器 redis-cli ...

  10. 2020ubuntu1804server编译安装redis笔记(三)启动服务和使用redis

    第一篇笔记记录了ubuntu1804server编译安装redis5,接下来要配置redis5了 网址:https://www.cnblogs.com/qumogu/p/12435694.html 第 ...

随机推荐

  1. java---迭代器(Iterator)

    迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为“轻量级”对象,因为创建它的代价小. Java中的Iterator功能比较简单, ...

  2. scrapy(2)——scrapy爬取新浪微博(单机版)

    Sina爬虫教程   Scrapy环境搭建   环境:window10 + python2.7(包含scrapy)+ mongoDB 1.1 安装集成了python2.7的anaconda   ana ...

  3. 简单理解SQL Server锁机制

    多个用户同时对数据库的并发操作时,可能会遇到下面几种情况,导致数据前后不一致: 1,A.B事务同时对同一个数据进行修改,后提交的人的修改结果会破坏先提交的(丢失更新): 2,事务A修改某一条数据还未提 ...

  4. YaoLingJump开发者日志(三)

      开始第二关的筹建.   增加了地刺和会移动的砖块.   每次增加一个新东西都要改好多代码,好累吖.   把第二关搞出来后发现太难了,强行调整难度.   修复了一些bug.   调整难度后还是发现太 ...

  5. 图解linux安装tomcat(附常用命令)

    本例使用的是centos6.5版本,具体内容如下 一.首先到官方下载tomcat服务 http://tomcat.apache.org/download-70.cgi 二.将tomcat上传至linu ...

  6. 【Docker 命令】- create命令

    docker create :创建一个新的容器但不启动它 语法 docker create [OPTIONS] IMAGE [COMMAND] [ARG...] OPTIONS同run命令 实例 使用 ...

  7. 系统管理员需知:25个Linux服务器安全技巧(转)

    来源:51CTO 作者:51CTO       大家都认为 Linux 默认是安全的,我大体是认可的 (这是个有争议的话题).Linux默认确实有内置的安全模型.你需要打开它并且对其进行定制,这样才能 ...

  8. WPF一个对象显示多个属性

    一个对象显示多个属性使用模板的方法: 如图: <dataTemplate x:key="MyDataTemplate">

  9. 【EF】Entity Framework 6新特性:全局性地自定义Code First约定

    应用场景 场景一:EF Code First默认使用类名作为表名,如果我们需要给表名加个前缀,例如将类名Category映射到表Shop_Category.将Product映射到Shop_Produc ...

  10. Mybatis笔记二

    一对一查询 案例:查询所有订单信息,订单信息中显示下单人信息. 注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询.如果从用户信息出发查询用户下的订单信息则 ...