首先初始化服务器的第一步就是创建一个redisServer类型的实例变量server来作为服务器的状态,并且为结构中的各个属性去设置默认值。
初始化server变量的工作是由redis.c/initServerConfig函数去完成的,完成的主要工作如下所示
设置服务器的运行ID
设置服务器的默认运行频率
设置服务器的默认配置文件路径
设置服务器的运行架构
设置服务器的默认端口号
设置服务器的默认RDB持久化条件和AOF持久化条件
初始化服务器的LRU时钟
创建命令表
initServerConfig主要是设置服务器状态的一些基本信息,并不会去创建数据结构(除了命令表,前面提到的用于找RedisCommand结构的字典)。
完成了初始化服务器状态结构后,就可以进入初始化第二个状态,开始载入配置选项了。
在启动Redis服务器的时候,是可以通过启动命令后面追加参数来修改选项的
举个栗子
redis-server --port 10086 //使用10086端口
redis-server redis.conf //使用redis.conf的配置文件
所以,在加载了默认配置后,还会去载入配置选项,进行对应属性修改
服务器在用initServerConfig函数初始化完server变量之后,就会开始载入用户给定的配置参数或者配置文件,并根据用户设定的配置,对server变量(初始化的服务器状态)的相关属性的值进行更改
如果用户为这些属性的相应选项设置了新的值,那么服务器就使用用户指定的值来更新相应的属性
如果用户没有为这些属性去设置新的值,那么服务器就会验用之前的InitServerConfig函数为属性设置的默认值
服务器在载入用户指定的配置文件后,就代表基本信息已经完成初始化了,现在可以开始初始化服务器状态里面的数据结构了。
前面提到过,initServerConfig对于数据结构,只会去初始化命令表,不过除了命令表之外,服务器状态还包含其他数据结构,比如下面的这些
server.clients链表,这个链表记录了所有与服务器相连的客户端的状态结构,里面的每一个元素都是一个客户端,即redisClient结构
server.db数组,存储Redis服务器里面所有数据库的数组
server.pubsub_channels字典与server.pubsub_patterns链表,前者用于保存频道订阅信息,后者用于保存模式订阅信息
用于执行Lua脚本的lua环境server.lua
用于保存慢查询日志的server.slowlog属性
当初始化到这一步时,就会去执行initServer函数,为以上提到的数据结构分配内存,并且在有需要的时候会关联初始化值。
为什么要放在这里去执行初始化数据结构呢?
**这是因为在配置文件中,是包含对这些数据结构信息的,必须要载入配置选项,才可以正确无误地去初始化数据结构,这其实也是为什么,初始化过程分成
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
了两个函数去执行,第一个是initServerConfig去主要负责初始化一般属性,而initServer去主要初始化数据结构**
除了初始化数据结构之外,initServer还需要去执行下面的一些操作
为服务器设置进程信号处理器(处理进程之间的通信,主要是父子进程)
创建共享对象(比如经常用到的一些回复字符串对象,还有前面提到过,服务器会一开始初始化1~10000的字符串对象,用于共享字符串,节约空间)
打开服务器的监听端口,并为监听套接字关联连接应答处理器,等待服务器正式运行时接收客户端的连接(连接过程是先要有一个监听套接字给客户端连接,产生AE_READABLE事件,触发连接应答处理器,然后进行一系列处理)
为serverCron函数创建时间事件(周期时间事件),等待服务器正式运行时执行serverCron函数
初始化服务器的后台I/O模块,为持久化的I/O操作做准备
现在已经对基本属性,还有数据结构做好了初始化,现在就是还原数据库的状态了,也就是通过RDB或者AOF文件去进行还原。