《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
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 4.表格-HTML基础
- 2.语义化-HTML进阶
- MATLAB 与 C 语言的混合编程
- leetcode树之二叉树的层平均值
- C++雾中风景15:聊聊让人抓狂的Name Mangling
- 【Java】15 File 类
- seaborn更高效的统计图表制作工具
- 牛客2019跨年AK场题解(一)
- qiankun proxySand 沙箱
- MATLAB 与 C 语言的混合编程实战之辛普森积分法、自适应辛普森积分
- Java那些事之JDK环境配置及集成开发环境Eclipse安装
- 敲代码、作诗、写论文无所不能?史上最大AI模型GPT-3霸榜Github
- 数据结构实验——校园导游 实现最小生成树+最短路
- Salesforce LWC学习(二十六) 简单知识总结篇三
- 【Java】13 异常