《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 条评论
登录 后参与评论

相关文章

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

集群间如何实现session共享【面试+工作】

5575
来自专栏西安-晁州

nodejs初印象

初学Nodejs,特意在此记录学习过程,算是对这段时间的一个summary吧,相互勉励,共同进步嘛,Now Begin: 1、什么是nodejs nodejs ...

1850
来自专栏北京马哥教育

Linux下top命令详解

豌豆贴心提醒,本文阅读时间7分钟 ? top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器...

3785
来自专栏枕边书

PHP中的数据库三、redis

memcache虽然好用,解决了数据库遇到高并发时的IO问题,但还有很多问题丞待解决: 1、数据持久性问题,memcache用内存进行存储,一旦memcache...

1889
来自专栏有趣的Python

9- Flask构建弹幕微电影网站-后台逻辑(一)

已上线演示地址: http://movie.mtianyan.cn 项目源码地址:https://github.com/mtianyan/movie_proj...

37910
来自专栏weixuqin 的专栏

一些杂想

(目前个人认为,Django 还是应该使用 Django1.11版本,稳定长期支持到2020年,兼容性也好。)

793
来自专栏Youngxj

emlog让微语支持html代码

2164
来自专栏维C果糖

史上最简单的 MySQL 教程(一)「数据库」

数据库,可以简单的解释为:高效的存储和处理数据的介质(主要分为磁盘和内存两种)。

37313
来自专栏熊二哥

MySQL快速入门

一直说要好好复习一下Mysql都木有时间,终于赶上最近新购买了阿里云,决定使用CentOS去试试.NET Core等相关的开发,于是决定好好的回顾下这部分知识,...

2097
来自专栏PHP技术

MYSQL性能优化分享(分库分表)

MYSQL性能优化之分库分表与不停机修改mysql表结构,需要的朋友可以参考下 1、分库分表 很明显,一个主表(也就是很重要的表,例如用户表)无限制的增长势必严...

3385

扫码关注云+社区