Redis核心原理与实践--Redis启动过程分析

本文深入解析Redis服务器的启动过程,包括服务器定义、main函数的执行流程,如配置加载、初始化Redis运行时数据、加载模块、启动事件循环器等。重点讨论了Redis如何处理配置文件、Sentinel模式、Module和LUA的初始化,以及服务器的定时任务和网络服务监听。
摘要由CSDN通过智能技术生成

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();
    }

    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值