Проектная лаборатория
Собственный Redis
Этап 21 · Сохранение в AOF
Отбор команд записи
Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.
На этом этапе вы обеспечите запись в AOF только команд, изменяющих данные.
Отбор команд, изменяющих данные
Команды, которые не меняют данные, например PING, GET и ECHO, не должны попадать в AOF, поскольку они не изменяют состояние.
Если сервер получает команды чтения и записи вперемешку, файл AOF должен содержать только команды записи в порядке поступления.
Например, если клиент отправляет:
$ redis-cli SET foo 1
$ redis-cli GET foo
$ redis-cli PING
$ redis-cli ECHO hello
$ redis-cli SET bar 2Файл AOF должен содержать только две команды SET:
*3\r\n
$3\r\n
SET\r\n
$3\r\n
foo\r\n
$1\r\n
1\r\n
*3\r\n
$3\r\n
SET\r\n
$3\r\n
bar\r\n
$1\r\n
2\r\n(Для удобства чтения последовательности \r\n выше показаны на отдельных строках. В настоящем файле каждая команда — непрерывная последовательность байтов.)
Никаких следов GET, PING или ECHO в файле быть не должно.
Тесты
Тестирующая программа запустит вашу программу так:
$ ./your_program.sh --dir <dir> --appendonly yes --appenddirname <append_dir_name> --appendfilename <append_file_name> --appendfsync alwaysОна отправит смесь изменяющих и неизменяющих данные команд, в том числе PING, GET, ECHO и CONFIG GET, чередуя их как минимум с одной командой записи.
Будет проверено, что:
- Файл AOF содержит только команды записи в правильном порядке.
- Байты команд, не меняющих данные, отсутствуют в файле.
- Каждая записанная команда имеет корректный формат RESP.
Примечания
- Если у вас уже есть логика различения команд записи и чтения, например для репликации, её можно использовать здесь.
- Для определения файла записи необходимо прочитать манифест. Тест использует нестандартное имя файла.
- На этом этапе не нужно поддерживать
--appendfsync everysec.
Проверка в вашей 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 ep6Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.