当你启动Redis的时候,Redis做了什么
直奔主题,当启动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做了什么的更多相关文章
- Redis : 为什么我们做分布式使用 Redis ?(转)
绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只会 Set Value 和 Get Value 两个操作,对 Redis 整体缺乏一个认知.这里对 Redis 常见问题做一个总结,解决 ...
- Linux Redis自动启动,Redis开机启动,Linux Redis设置开机启动
Linux Redis自动启动,Redis开机启动,Linux Redis设置开机启动 >>>>>>>>>>>>>> ...
- [redis] mac下redis安装、设置、启动停止
From: https://www.cnblogs.com/shoren/p/redis.html 下载安装 需要下载release版本,下载地址: http://download.redis.io/ ...
- Linux Redis安装,Linux如何安装Redis,Linux Redis自动启动,Redis开机启动
Linux Redis安装,Linux如何安装Redis,Linux Redis自动启动,Redis开机启动 >>>>>>>>>>>& ...
- devilbox(三):在docker中启动带密码的redis数据库
背景概述: 之前是使用docker搭建了一套集成的开发环境devilbox,也说了这个环境可以自定义.其实搭建这个环境一是为了练习docker使用,二是搭建我们测试环境,主要用到各种数据库,然而安装教 ...
- 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 ...
- 【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 ...
- [Redis]windows下redis的安装和启动
官方的下载地址是: http://redis.io/download 在win64一栏中能够看到redis原本是没有windows版本号的,windows版本号是Microsoft Open Tech ...
- 二、Redis启动、停止、Redis命令行的操作
1.redis命令 redis执行了make install后,redis的课执行文件都会自动复制到 /usr/local/bin 目录 redis-server redis服务器 redis-cli ...
- 2020ubuntu1804server编译安装redis笔记(三)启动服务和使用redis
第一篇笔记记录了ubuntu1804server编译安装redis5,接下来要配置redis5了 网址:https://www.cnblogs.com/qumogu/p/12435694.html 第 ...
随机推荐
- SQL 单表分页存储过程和单表多字段排序和任意字段分页存储过程
第一种:单表多字段排序分页存储过程 --支持单表多字段查询,多字段排序 create PROCEDURE [dbo].[UP_GetByPageFiledOrder] ( ), --表 ...
- 软工网络15团队作业4——Alpha阶段敏捷冲刺-4
一.当天站立式会议照片: 二.项目进展 昨天已完成的工作: 完成程序副界面的设计与信息的输入统计 明天计划完成的工作: 日期等细致信息的处理 工作中遇到的困难: 对微信小程序开发的代码构成有了一些了解 ...
- document,element,dom对象api详解
Document对象: 根元素的访问,也就是HTML标签的访问.使用document.documentElement访问根对象. 使用Document对象查找对象 getElementById():通 ...
- activemq控制面板里的NumberOfPendingMessages、MessagesEnqueued、MessagesDequeued含义
Number Of Consumers 消费者 这个是消费者端的消费者数量.Number Of Pending Messages 等待消费的消息 这个是当前未出队列的数量.可以理解为总接收数-总出队列 ...
- HASH表的实现(拉链法)
本文的一些基本概念参考了一部分百度百科,当然只保留了最有价值的部分,代码部分完全是自己实现! 简介 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据 ...
- OSI参考模型和TCP/IP参考模型
- iOS-学习UIKIt框架的重要性
前言: 众所周知,我们的移动设备的屏幕上可以展示很多图形界面,作为用户的我们可以通过屏幕上的图形界面浏览信息,也可以通过与图形界面的简单交互,在移动设备上实现各种各样的功能操作.....可以说,没 ...
- 【bzoj1304】[CQOI2009]叶子的染色 树形dp
题目描述 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部结点和叶子均可)着以黑色或白色.你的着色方案应该保证根结点到每个叶子的简单路径上都至少包含一个有色结点( ...
- 【codevs3160】最长公共子串 后缀数组
题目描述 给出两个由小写字母组成的字符串,求它们的最长公共子串的长度. 输入 读入两个字符串 输出 输出最长公共子串的长度 样例输入 yeshowmuchiloveyoumydearmotherrea ...
- 利用cmake查看opencv的源码
当我们有时想查看opencv自带的函数的源代码,比如函数cvCreateImage, 此时我们选中cvCreateImage, 点击鼠标右键->转到定义,我们会很惊讶的发现为什么只看到了cvCr ...