赞
踩
一个Redis服务器从启动到能够接受客户端的命令请求,需要经过一系列的初始化和设置过程,比如初始化服务器状态,接受用户指定的服务器配置,创建相应的数据结构和网络连接等等
初始化服务器的第一步就是创建一个struct redisServer类型的实例变量server作为服务器的状态,并为结构中的各个属性设置默认值。初始化server变量的工作由redis.c/initServerConfig函数完成,
void initServerConfig(void) { // 设置服务器的运行id getRandomHexChars(seerver.runid, REDSI_RUN_ID_SIZE); // 为运行id加上结尾字符 server.runid[REDIS_RUN_ID_SIZE] = '\0'; // 设置默认配置文件路径 server.configfile = NULL; // 设置默认服务器频率 server.hz = REDIS_DEFAULT_HZ; // 设置服务器的运行架构 server.arch_bits = (sizeof(long) == 8) ? 64 :32; // 设置默认服务器端口号 server.port = REDIS_SERVERPORT; // ... }
以下是initServerConfig函数完成的主要工作:
在启动服务器时,用户可以通过给定配置参数或者指定配置文件来修改服务器的默认配置。举个例子,如果我们在终端输入:
redis-server --port 10086
那么我们就通过给定配置参数的方式,修改了服务器的运行端口号。另外,如果在终端输入:
redis-server redis.conf
并且redis.conf文件中b包含以下内容:
# 将服务器的数据库数量设置为32个
databases 32
# 关闭RDB文件的压缩功能
rdbcompression no
那么我们就通过指定配置文件的方式修改了服务器的数据库数量,以及RDB持久化模块的压缩功能。服务器在用initServerConfig函数初始化server变量之后,就会开始载入用户给定的配置参数和配置文件,
并根据用户设定的配置,对server变量相关属性的值进行修改。例如,在初始化server变量时,程序会为决定服务器端口号的port属性设置默认值:
void initServerConfig(void) {
// ...
// 默认值为6379
server.port = REDIS_SERVERPORT;
}
不过,如果用户在启动服务器时为配置选项port指定了新值10086,那么server.port属性的值就会被更新为10086,
这将使得服务器的端口号从默认的6379变为yoghurt指定的10086.
例如,在初始化server变量时,程序会为决定数据库数量的dbnum属性设置默认值:
void initServerConfig(void) {
// ...
// 默认值为16
server.dbnum = REDIS_DEFUALT_DBNUM;
}
不过,如果用户在启动服务器时为选项databases设置了值32,那么server.dbnum属性的值就会被更新为32,这将使得服务器的数据库数量从默认的16个变为用户指定的32个。其他配置选项相关的服务器状态属性的情况与上面列举的port属性和dbnum属性一样:
在之前执行initServerconfig函数初始化server状态时,程序只创建了命令表一个数据结构,不过除了命令表之外,服务器状态还包括其他数据结构,比如:
file use E:\redis\redis-server.exe /path/to/redis.conf _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 3.0.504 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in standalone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 20212 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' [20212] 01 Apr 21:06:44.205 # Server started, Redis version 3.0.504 [20212] 01 Apr 21:06:44.210 * DB loaded from disk: 0.005 seconds [20212] 01 Apr 21:06:44.210 * The server is now ready to accept connections on port 6379
在完成了对服务器状态server变量的初始化之后,服务器需要载入RDB文件或者AOF文件,并根据文件记录的内容来还原服务器的数据库状态。根据服务器是否启用了AOF持久化功能,服务器载入数据时所使用的目标文件会有所不同:
[7256] 01 Apr 21:07:11.795 * DB loaded from disk: 0.000 seconds
在初始化地最后一步,服务器将打印出以下日志:
[7256] 01 Apr 21:07:11.795 * The server is now ready to accept connections on port 6379
并开始执行服务器的事件循环(loop).至此,服务器的初始化工作圆满完成,服务器现在开始可以接受客户端的连接请求,并处理客户端发来的命令请求了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。