Redis服务器负责接收处理用户请求,为用户提供服务。
Redis服务器的启动命令格式如下:
redis-server [ configfile ] [ options ]
configfile参数指定配置文件。options参数指定启动配置项,它可以覆盖配置文件中的配置项,如
redis-server /path/to/redis.conf --port 7777 --protected-mode no
该命令启动Redis服务,并指定了配置文件/path/to/redis.conf,给出了两个启动配置项:port、protected-mode。
本文通过阅读Redis源码,分析Redis启动过程,内容摘自新书《Redis核心原理与实践》。
本文涉及Redis的很多概念,如事件循环器、ACL、Module、LUA、慢日志等,这些功能在作者新书《Redis核心原理与实践》做了详尽分析,感兴趣的读者可以参考本书。
服务器定义
提示:本章代码如无特殊说明,均在server.h、server.c中。
Redis中定义了server.h/redisServer结构体,存储Redis服务器信息,包括服务器配置项和运行时数据(如网络连接信息、数据库redisDb、命令表、客户端信息、从服务器信息、统计信息等数据)。
struct redisServer {
pid_t pid;
pthread_t main_thread_id;
char *configfile;
char *executable;
char **exec_argv;
...
}
redisServer中的属性很多,这里不一一列举,等到分析具体功能时再说明相关的server属性。
server.h中定义了一个redisServer全局变量:
extern struct redisServer server;
本书说到的server变量,如无特殊说明,都是指该redisServer全局变量。例如,第1部分说过server.list_max_ziplist_size等属性,正是指该变量的属性。
可以使用INFO命令获取服务器的信息,该命令主要返回以下信息:
- server:有关Redis服务器的常规信息。
- clients:客户端连接信息。
- memory:内存消耗相关信息。
- persistence:RDB和AOF持久化信息。
- stats:常规统计信息。
- replication:主/副本复制信息。
- cpu:CPU消耗信息。
- commandstats:Redis 命令统计信息。
- cluster:Redis Cluster集群信息。
- modules:Modules模块信息。
- keyspace:数据库相关的统计信息。
- errorstats:Redis错误统计信息。
INFO命令响应内容中除了memory和cpu等统计数据,其他数据大部分都保存在redisServer中。
main函数
server.c/main函数负责启动Redis服务:
int main(int argc, char **argv) {
...
// [1]
server.sentinel_mode = checkForSentinelMode(argc,argv);
// [2]
initServerConfig();
ACLInit();
moduleInitModulesSystem();
tlsInit();
// [3]
server.executable = getAbsolutePath(argv[0]);
server.exec_argv = zmalloc(sizeof(char*)*(argc+1));
server.exec_argv[argc] = NULL;
for (j = 0; j < argc; j++) server.exec_argv[j] = zstrdup(argv[j]);
// [4]
if (server.sentinel_mode) {
initSentinelConfig();
initSentinel();
}