Проектная лаборатория
Собственный Redis
Этап 20 · Сохранение в AOF
Запись нескольких команд
Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.
На этом этапе вы расширите журналирование AOF для нескольких команд записи.
Добавление нескольких команд
Каждая команда записи должна добавляться в конец файла AOF в порядке поступления, формируя полный журнал изменений. Это относится к любой команде, меняющей данные, например SET, DEL, INCR, LPUSH и другим, а не только к SET.
Например, если сервер получает:
$ redis-cli SET foo 100
$ redis-cli SET bar 200Файл AOF должен содержать обе команды по порядку:
*3\r\n
$3\r\n
SET\r\n
$3\r\n
foo\r\n
$3\r\n
100\r\n
*3\r\n
$3\r\n
SET\r\n
$3\r\n
bar\r\n
$3\r\n
200\r\n(Для удобства чтения последовательности \r\n выше показаны на отдельных строках. В настоящем файле каждая команда — непрерывная последовательность байтов.)
Каждая команда добавляется непосредственно после предыдущей, без разделителей. При воспроизведении структуры RESP (*3\r\n...) достаточно, чтобы определить границы команд.
Тесты
Тестирующая программа создаст внутри <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 <key1> <value1>
$ redis-cli SET <key2> <value2>Будет проверено, что:
- Обе команды присутствуют в файле AOF в порядке отправки.
- Каждая команда закодирована в корректном формате RESP.
- Записи сброшены на диск до получения ответа клиентом, поскольку
appendfsyncравенalways.
Примечания
- Если ваша реализация уже добавляет данные в конец файла, а не перезаписывает его, этот этап может пройти без изменений.
- Для определения файла записи необходимо прочитать манифест. Тест использует нестандартное имя файла.
- На этом этапе не нужно поддерживать
--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 fi1Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.