Проектная лаборатория

Собственный Redis

0 / 124этапов пройдено

Этап 19 · Сохранение в AOF

Запись одной команды

Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.

На этом этапе вы запишете одну команду изменения данных в файл AOF.

Запись в файл AOF

Вы уже создаёте каталог AOF, файл и манифест при запуске. Теперь начнёте их использовать. Когда задано --appendonly yes и сервер обрабатывает команду записи, например SET, он должен добавить её в конец файла AOF в формате RESP.

Сервер должен прочитать манифест, чтобы узнать имя файла AOF для записи. Запись type i указывает на активный инкрементальный файл.

Например, если сервер получает:

$ redis-cli SET foo 100

Он должен добавить в файл AOF следующее:

*3\r\n$3\r\nSET\r\n$3\r\nfoo\r\n$3\r\n100\r\n

Это то же кодирование RESP, которое сервер уже использует для обмена данными. Команда сохраняется точно в полученном виде, чтобы её можно было воспроизвести после перезапуска и восстановить состояние.

Параметр appendfsync always

Когда appendfsync равен always, сервер обязан сбросить запись на диск до отправки ответа клиенту. Это гарантирует сохранность любой подтверждённой записи, даже если сервер аварийно завершится сразу после ответа.

Тесты

Тестирующая программа создаст внутри <dir>/<append_dir_name>:

  • Манифест, в котором запись type i указывает на файл <random_file_name>.1.incr.aof.
  • Соответствующий пустой файл AOF: <random_file_name>.1.incr.aof.

Она запустит вашу программу так:

$ ./your_program.sh --dir <dir> --appendonly yes --appenddirname <append_dir_name> --appendfilename <append_file_name> --appendfsync always

Затем отправит одну команду записи:

$ redis-cli SET <key> <value>

Будет проверено, что:

  • Команда добавлена в файл AOF из манифеста, а не в стандартный <appendfilename>.1.incr.aof.
  • Команда записана в корректном формате RESP.
  • Запись сброшена на диск до получения ответа клиентом.

Примечания

  • Чтобы определить файл для записи, необходимо прочитать манифест. Тест намеренно использует нестандартное имя, проверяя, что сервер следует манифесту.
  • На этом этапе не нужно поддерживать --appendfsync everysec. Проверяется только always.
  • Команда кодируется в том же формате RESP, который уже используется для обмена данными между клиентом и сервером. Теперь вы просто записываете её в файл вместо сокета.

Проверка в вашей IDE

Нужны Node.js, Git, Go 1.24+ для тестеров и инструменты выбранного языка. Тестеры загружаются и запускаются локально; отдельным проектам нужны дополнительные системные зависимости.

Настройка проекта и IDE

1. Создайте проект один раз

node '/opt/graphlms/tools/project-lab/cli.mjs' init redis ./my-redis --language go

2. Откройте папку в IDE

cd ./my-redis

Реализуйте требования этапа в созданном проекте.

Запустите из папки проекта

node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage dc8

Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.

Результат проверки

go / ЛОКАЛЬНО

Подключение к локальной проверке…

Здесь появится результат

Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.

GraphLMS — инженерная лаборатория роста