Проектная лаборатория
Собственный Redis
Этап 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 go2. Откройте папку в IDE
cd ./my-redisРеализуйте требования этапа в созданном проекте.
Запустите из папки проекта
node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage dc8Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.