[Чтение исходного кода Redis] Что делает Redis при запуске Redis

Redis задняя часть база данных сервер

Сразу к делу, какие операции выполняет Redis при запуске Redis?

Предполагая, что Redis установлен в каталоге /usr/local/, запустите Redis, выполнив/usr/local/bin/redis-server -c xxx.confспособ выполнения. redis-server — это программа, созданная путем компиляции файла server.c, поэтому, если вы хотите узнать, как запускается redis, вы должны начать с функции server.c/main.

Конкретный код можно увидеть:server.c

Читая основную функцию, вы можете знать, что весь запуск примерно разделен на пять шагов: инициализация структуры сервера, загрузка параметров из папки конфигурации, инициализация сервера, загрузка постоянного файла и начало прослушивания событий.

Redis использует структуру redisServer для хранения атрибутов и информации о сервере.В файле server.c определена глобальная серверная переменная:

struct redisServer server;

Кроме того, определена таблица команд redis, которая содержит команды и соответствующие им функции:

struct redisCommand redisCommandTable;

В основной функции Redis сначала вызывает функцию initServerConfig для инициализации структуры сервера.

Инициализировать структуру сервера

Основная функция вызывает функцию initServerConfig для установки некоторых значений по умолчанию для свойств сервера, таких как:

Текущий идентификатор сервера

Номер порта по умолчанию, используемый Redis, CONFIG_DEFAULT_SERVER_PORT = 6379, определенный в server.h.

LRU часы

Параметры, связанные с резервным копированием ведущий-ведомый

список команд

медленные параметры запроса

Затем текущий путь выполнения и параметры сохраняются для подготовки к последующим перезапускам сервера с использованием тех же параметров:

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]);

Нагрузка параметров из файла конфигурации

Для Redis существует множество параметров запуска, один из которых — указать файл конфигурации. После инициализации структуры сервера большинство свойств будут заданы структуре, но некоторые параметры можно воспроизвести через конфигурационный файл, например номер порта redis.

После инициализации структуры сервера функция определит, существует ли указанный файл конфигурации, если да, то вызовет функцию loadServerConfig, чтобы загрузить соответствующую конфигурацию из файла конфигурации, и установит параметры, соответствующие файлу конфигурации, в структуру сервера.

Процесс чтения параметров загрузки конфигурационного файла выглядит следующим образом:

  • 1. Разделить элементы параметров
  • 2. Пропустить пустые строки и строки комментариев
  • 3, отметьте один по элементу, если параметр законно, установите значение конфигурации на атрибут сервера

К этому моменту большинство свойств redisServer были установлены, и на сервере все еще есть много структур данных, которые не были инициализированы.Функция initServer продолжает следующую работу по инициализации.

Инициализировать структуры данных сервера

Основная функция вызовет функцию initServer для инициализации состояния сервера, например:

Идентификатор процесса

список клиентов

Из связанного списка библиотеки

Создание общих объектов для общих значений

Инициализировать цикл событий

Откройте TCP, чтобы начать прослушивание сокета

Создайте базу данных сервера и инициализируйте внутреннее состояние

Создать таймер события времени для таймера serverCron

Если AOF включен, откройте файл AOF и используйте его для последующего восстановления данных.

Инициализировать модуль журнала медленных запросов

Инициализировать фоновый модуль ввода-вывода

Загрузить постоянный файл, восстановить базу данных

После инициализации состояния сервера сервер уже находится в состоянии запуска.Поскольку у Redis есть функция сохраняемости, серверу также необходимо загрузить соответствующие файлы для восстановления предыдущих данных базы данных. Определите, какой режим Redis в настоящее время включен. Если это AOF, восстановите данные базы данных через AOF. В противном случае загрузите файл RDB и восстановите данные базы данных через файл RDB.

начать слушать события

Основная функция установит функции обратного вызова beforeSleep и afterSleep, а затем вызовет функцию aeMain, чтобы запустить зацикливание событий и начать прослушивание событий. Функция aeMain представляет собой бесконечный цикл, постоянно отслеживающий поступление новых запросов.

/*
 * server启动后,main函数的最终步骤,不断地调用beforesleep和aeProcessEvents
 */
void aeMain(aeEventLoop *eventLoop) {
    eventLoop->stop = 0;
    while (!eventLoop->stop) {
        if (eventLoop->beforesleep != NULL)
            eventLoop->beforesleep(eventLoop);
        aeProcessEvents(eventLoop, AE_ALL_EVENTS|AE_CALL_AFTER_SLEEP);
    }
}

Таким образом, упрощенная блок-схема всего запуска сервера выглядит следующим образом:

redisServer

Оригинал статьи, ограниченный стиль написания, недостаток знаний и знаний, если есть неточности в статье, сообщите пожалуйста.

Для более интересного контента, пожалуйста, обратите внимание на личный публичный номер.