《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