当你启动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 第 ...
随机推荐
- iOS- 无处不在,详解iOS集成第三方登录(SSO授权登录<无需密码>)
1.前言 不多说,第三登录无处不在!必备技能,今天以新浪微博为例. 这是上次写的iOS第三方社交分享:http://www.cnblogs.com/qingche/p/3727559.html 可 ...
- 3ds Max学习日记(五)
把实验室要用的小工具做了出来后,忙里偷闲,把第四章没看完的视频看完了.修改器(modifier)什么的还是挺好玩的. FFD,车削,倒角,倒角剖面,对称,挤出,晶格,扭曲,融化,弯曲,网格平滑 ...
- Qt-排序
1.要求传入起始指针,总长度,单元素空间占用大小(sizeof(A[i])),判断函数. 判断函数参数类型为const void *,使用需要在函数内自行转换为对应类型, 返回值为整数型,升序排序时正 ...
- 第一次通过CLR Profile解决内存占用过高的问题
炮哥:"嘿,哥们,忙啥呢,电脑卡成这逼样." 勇哥:"在用CLR Profile工具分析下FlexiPrint的内存占用情况." 炮哥:“哎哟,不错啊,玩高级的 ...
- thinkPHP框架单一入口文件解析
一.index.php (可参考ThinkPHP学习手册http://document.thinkphp.cn/manual_3_2.html#entrance_file) index.php单入口 ...
- arc076 F - Exhausted? (霍尔定理学习)
题目链接 Problem Statement There are M chairs arranged in a line. The coordinate of the i-th chair ($$$1 ...
- OpenStack Queens版本Horizon定制化开发
工具环境 1.VMware workstation 12+: 2.Ubuntu系统+Linux Pycharm: 3.OpenStack Queens版本Horizon代码: 问题及解决 1.项目代码 ...
- 【刷题】SPOJ 705 SUBST1 - New Distinct Substrings
Given a string, we need to find the total number of its distinct substrings. Input T- number of test ...
- Android 打开照相机、获取相册图片、获取图片并裁减
一.调用照相机 注:surfaceView在当Activity不在前台的时候,会被销毁(onPause方法之后,执行销毁方法)当Activity回到前台时,在Activity执行onResume方法之 ...
- 51nod 1554:欧姆诺姆和项链——题解
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1554 题目: 有一天,欧姆诺姆发现了一串长度为n的宝石串,上面有五颜六色 ...