《Redis设计与实现》读书笔记(二十三) ——Redis服务器初始化

《Redis设计与实现》读书笔记(二十三) ——Redis服务器初始化

(原创内容,转载请注明来源,谢谢)

redis服务器开启时,会先进行初始化,主要有五个步骤,如下:

1、初始化状态结构

首先,会创建一个structredisServer实例变量,存储服务器的状态。

接着,redis初始化服务器,会执行一次redis.c/initServerConfig函数,主要工作是设置服务器运行ID、默认运行频率、默认配置文件路径、运行架构、默认端口号、RDB条件、AOF条件、LRU时钟、创建命令表。

初始化状态结构,都是简单的结构,后续的数据库、共享对象、慢查询日志、Lua环境等,都是后面才创建的。

2、载入配置选项

在启动redis服务器时,可以通过参数指定配置文件、端口号等。redis会载入这些配置,并且和默认不同的时候,会覆盖默认的配置。

例如输入redis-server –port5000,则会先创建端口基于6379的,再在这一步修改端口号为5000。

在加载用户配置的文件,如果有定义新的结果,则使用新结果,否则就使用默认值。

3、初始化服务器数据结构

1)创建数据结构

在第一步,只创建了一个命令表,在此步骤则会创建其他数据结构,

包括:

server.client    //链表,用于存储普通客户端,每个节点是一个redisClient结构;
server.db        //链表,保存所有的数据库;
server.pubsub_channels//链表,保存频道订阅信息;server.pubsub_patterns链表,保存模式订阅信息。
server.lua       //用于执行lua脚本的环境。
server.showlog   //用于保存慢查询。

服务器会为上述结构分配内存空间。在此步骤才创建数据结构,是因为如果第一步创建,而第二步加载用户自定义配置的时候,有可能会修改到某些内容,则还需要重写。而命令表由于是固定的,因此可以放到第一步创建。

2)其他设置操作

除了创建数据结构,还会进行一些重要的设置。

包括:

为服务器设置进程信号处理器。

创建共享对象,包括整数1~10000的字符串对象,“OK”、“ERR”回复的字符串对象等,用于避免反复创建相同对象。

打开服务器监听端口,为监听的套接字添加相应的应答事件,等待服务器正式运行时接收客户端的连接。

为serverCron函数创建时间事件,等待服务器正式执行serverCron。

如果AOF持久化开启,则打开aof文件,如果不存在则创建aof文件。

初始化服务器后台I/O模块(bio),为将来的I/O做好准备。

4、还原数据库状态

如果开启aof,则载入aof文件;如果没有开启aof,则载入rdb文件。

载入完成后,在日志中打印载入的耗时。

5、执行事件循环

初始化最后一步,服务器将打印连接成功的日志。并且开始事件循环,初始化正式完成,可以开始处理客户端的请求。

redis服务器相关内容总结:

1、命令请求发送主要步骤——客户端命令发给服务器;服务器解析命令并存储在客户端的结构体相应属性;服务器检查是否具备执行条件,检查完毕后执行,执行后进行执行后的后续工作;将执行结果回复客户端。

2、serverCron函数每100毫秒执行1次,主要更新服务器状态、管理客户端、管理数据库、执行持久化,保证redis服务器正常提供服务。

3、服务器启动到接收客户端命令,主要步骤——初始化服务器状态;载入用户自定义配置;创建服务器用到的数据结构;还原数据库状态;执行事件循环,开始提供服务。

——written by linhxx 2017.09.09

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-09-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏GreenLeaves

JavaScript值延迟脚本和异步脚本

Html 4.0为<script>标签定义了defer属性,这个属性的用途是表名脚本在执行时,不会影响页面的构造。也就是说,脚本会延迟到整个页面解析完毕之后在运...

1917
来自专栏xingoo, 一个梦想做发明家的程序员

基于Spring Boot的Logback日志轮转配置

在生产环境下,日志是最好的问题调试和跟踪方法,因此日志的地位是十分重要的。我们平时经常使用的log4j,slf4j,logback等等,他们的配置上大同小异。...

1897
来自专栏python爬虫实战之路

CentOS7.0安装/卸载MySQL

在MySQL官网中下载YUM源rpm安装包:http://dev.mysql.com/downloads/repo/yum/

612
来自专栏吴伟祥

Nginx认识与实践(一) 转

笔者按照文章:《Nginx服务器开箱体验》 中的实验,给出了一份简要的清单配置举例:

693
来自专栏Java帮帮-微信公众号-技术文章全总结

操作Linux这些命令够用了

操作Linux这些命令够用了 玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因...

3876
来自专栏weixuqin 的专栏

Mac上写C++

3699
来自专栏前端萌媛的成长之路

NPM基本介绍(一)

1392
来自专栏维C果糖

详述 IntelliJ IDEA 中恢复代码的方法

在咱们正常开发项目的时候,难免遇到在开发过程中由于某种原因,想要将代码恢复到前一版本的情景。特别是在咱们删除了某些代码,想要恢复之前删除的代码的时候,了解这个在...

1808
来自专栏GopherCoder

专栏:002 :python 文件操作

1295
来自专栏小樱的经验随笔

【干货分享】dos命令大全

一般来说dos命令都是在dos程序中进行的,如果电脑中安装有dos程序可以从开机选项中选择进入,在windows 系统中我们还可以从开始运行中输入cmd命令进入...

2659

扫描关注云+社区