Рубрики
Uncategorized

Прочитайте исходный код с помощью Dabin – Redis 2 – Как сервер отвечает на запросы клиентов? (1)

Автор оригинала: David Wong.

В прошлый раз, когда мы спросили: “Что сделала программа для запуска сервера?” , с исходным кодом у меня есть глубокое понимание процесса запуска redis server.

Теперь, когда сервер Redis запущен, нам нужно подключиться к службе Redis, чтобы что-то сделать. Здесь мы можем пройти тест redis-cli.

Теперь клиент и сервер готовы, так что Как клиенты и серверы Redis устанавливают соединения? Как сервер отвечает на запросы клиентов?

1 Подключите Сервер

Для связи между клиентом и сервером первым шагом является установление соединения. Далее давайте рассмотрим процесс подключения между redis-cli и сервером.

Помните, когда мы в последний раз использовали его gdb Какова процедура отладки программы? Давайте еще раз рассмотрим redis-cli и посмотрим, как работает исходный код. Прежде чем начать, не забудьте открыть его в редакторе redis-cli.c Найдите основное Расположение функций, в конце концов, GDB выглядит комфортно без редактора.

Шаги по отладке следующие:

# bash
cd /opt/redis-3.2.13
// Start the Redis service. Ctrl + C can push out the server startup page while keeping the server running
./src/redis-server --port 8379 &
// Debugging redis-clli
gdb ./src/redis-cli
# gdb 
(gdb) b main
(gdb) r -p 8379
(gdb) layout src
(gdb) focus cmd

После выполнения описанных выше действий мы войдем в следующий интерфейс:

Затем мы можем вернуться на страницу редактора и посмотреть, правильно ли это. главная Какая строка в функции интереснее, остановитесь для изучения. По строке 2618 мы увидим исполнение. Синтаксический анализ Эта функция, судя по названию, инициализирует некоторые дополнительные параметры. Давайте зайдем и посмотрим.

1.1 Инициализация конфигурации клиента

Этапы выполнения функции: главная -> параметры синтаксического анализа -> главная

Посмотрим, в исполнении. редис-кли Параметры, которые мы переносим, разрешаются в этой функции, например, то, что мы переносим при запуске. --Параметры p анализируются в строке 996 и присваиваются элементу конфигурации порта хоста клиента. На следующем рисунке:

1.2 Режим запуска Клиента

Этапы выполнения функции: главная

Вернитесь к main Функции, и вы увидите много кода, который появится позже cliConnect Функция. Обратите внимание, что это не означает, что redis-cli выполняется много раз cliConnect Функция. Фактически, каждый блок операторов if представляет режим подключения для клиентов. Версия 3.2.13 поддерживает следующие режимы:

  1. Режим задержки: Режим задержки. redis-cli --задержка -p 8379 Используется для проверки задержки соединения клиент-сервер. Также --история и --dist Варианты отображения различных форм.
  2. Подчиненный режим: Имитирует подчиненный режим.
  3. Получить режим RDB: Создавайте и отправляйте постоянные файлы RDB и сохраняйте их локально.
  4. Режим трубы: Режим трубы. Команда инкапсулируется в указанный формат данных и пакетами отправляется на сервер redis для выполнения.
  5. Найти большие ключи: Статистическое распределение больших ключей.
  6. Режим статистики: Статистический режим. Отображение статистики сервера в режиме реального времени.
  7. Режим сканирования: Сканируйте ключи указанного режима, который эквивалентен режиму сканирования.
  8. Режим тестирования LRU: Тестирование попаданий алгоритма LRU в режиме реального времени.

1.3 Подключение Сервера

Этапы выполнения функции: главная -> cliConnect -> redisConnect – > |/redisContextInit - > |/redisContextConnectTcp – > |/_redisContextConnectTcp - > |/cliConnect

Мы не использовали специальный режим для запуска выше, поэтому мы увидим реальный вызов на линии 2687. cliConnect Функция. Следуйте за ним и давайте посмотрим, как он подключается к серверу.

оставайтесь cliConnect В функции мы видим, что в соответствии с хост-сокетом элементами конфигурации используются разные режимы подключения. Судя по названию, мы, вероятно, можем догадаться, что одно из них является соединением сокета TCP, а другое-собственным соединением сокета Unix.

Если вы хотите использовать сокетное соединение UNIX, вам нужно только настроить его в соответствии с форматом. хост-сокет Ты можешь: ./src/redis-cli -s/tmp/redis.носок

Здесь мы используем TCP-соединение через сокет, используя повторное отключение Функция устанавливает соединение.

Продолжайте отслеживать, и мы увидим шаги выполнения функции, показанные выше. _ _redisContext Подключение Tcp Как вы можете видеть в функции getaddrinfo и подключиться

1.4 Проверьте разрешения и выберите базы данных

Этапы выполнения функции: cliConnect -> сеть поддерживает жизнь -> Аутентификация cli -> cli Выберите -> главная

Вернитесь к функции cliConnect , если вы подключаетесь к серверу нормально, TCP-соединение, созданное нами выше, также будет установлено как длинное соединение, а затем проверьте разрешения и выберите подключение к базе данных.

...
/* Set aggressive KEEP_ALIVE socket option in the Redis context socket
 * in order to prevent timeouts caused by the execution of long
 * commands. At the same time this improves the detection of real
 * errors. */
anetKeepAlive(NULL, context->fd, REDIS_CLI_KEEPALIVE_INTERVAL);
/* Do AUTH and select the right DB. */
if (cliAuth() != REDIS_OK)
    return REDIS_ERR;
if (cliSelect() != REDIS_OK)
    return REDIS_ERR;
...

На данный момент мы завершили весь процесс установления соединения между клиентом и сервером. Заинтересованные партнеры могут попытаться подключиться к несуществующим IP-адресам или портам, наблюдать за временем, когда программа выдает исключение, и быть знакомыми со всем процессом подключения.

После того, как клиент установит соединение с сервером, ключом в базе данных можно управлять с помощью соответствующих команд. Теперь давайте взглянем на УСТАНОВИТЬ ЗНАЧЕНИЕ КЛЮЧА Возьмите команды в качестве примера, чтобы увидеть, как они выполняются.

2 Отправить запрос на команду

Когда пользователь вводит запрос команды в клиенте, клиент преобразует запрос команды в формат протокола, а затем отправляет преобразованный запрос команды на сервер через сокет, подключенный к серверу, как показано на рисунке 3:

Поэтому для нашего приведенного выше запроса команды клиент обратится к:

"*3\r\n$3\r\nSET\r\n$3\r\nKEY\r\n$5\r\nVALUE\r\n"

Затем отправьте его на сервер.

Это процесс отправки команд от клиента на сервер. В следующем разделе мы увидим, как сервер отвечает на запрос клиента.