Проектная лаборатория
Собственный Redis
Этап 44 · Потоки
Проверка идентификаторов записей
Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.
На этом этапе вы добавите проверку идентификаторов записей в XADD.
Идентификаторы записей
Идентификаторы обеспечивают порядок записей в потоках Redis.
Каждый идентификатор состоит из двух целых чисел, разделённых дефисом: <millisecondsTime>-<sequenceNumber>.
Например:
entries:
- id: 1526985054069-0 # (ID of the first entry)
temperature: 36
humidity: 95
- id: 1526985054079-0 # (ID of the second entry)
temperature: 37
humidity: 94
# ... (and so on)Идентификаторы уникальны в пределах потока и гарантированно возрастают: идентификатор новой записи всегда больше идентификаторов всех предыдущих.
Задание идентификаторов в XADD
Идентификатор в XADD можно указать в трёх форматах:
- Явно (
1526919030474-0). - С автоматическим порядковым номером (
1526919030474-*). - С автоматическими временем и порядковым номером (
*).
Пока вы будете обрабатывать только явные идентификаторы, например 1526919030474-0. Два других варианта появятся позже.
Реализация XADD должна проверять идентификатор по правилам:
- Идентификатор строго больше идентификатора последней записи.
- Часть
millisecondsTimeнового идентификатора больше либо равнаmillisecondsTimeпоследней записи. - Если значения
millisecondsTimeравны,sequenceNumberновой записи должен быть большеsequenceNumberпоследней.
- Часть
- Если поток пуст, идентификатор должен быть больше
0-0. Минимальный допустимый идентификатор Redis —0-1.
Пример добавления записи с корректным, а затем некорректным идентификатором:
$ redis-cli XADD some_key 1-1 foo bar
"1-1"
$ redis-cli XADD some_key 1-1 bar baz
(error) ERR The ID specified in XADD is equal or smaller than the target stream top itemВторая команда завершается ошибкой, поскольку 1-1 не больше последнего идентификатора.
Ещё один пример:
$ redis-cli XADD some_key 1-1 foo bar
"1-1"
$ redis-cli XADD some_key 0-2 bar baz
(error) ERR The ID specified in XADD is equal or smaller than the target stream top itemИдентификатор 0-2 некорректен: его millisecondsTime меньше millisecondsTime последнего идентификатора.
Наконец, 0-0 всегда недопустим: идентификаторы должны быть строго больше 0-0:
$ redis-cli XADD some_key 0-0 bar baz
(error) ERR The ID specified in XADD must be greater than 0-0Тесты
Тестирующая программа запустит вашу программу так:
$ ./your_program.shЗатем создаст несколько записей через XADD.
$ redis-cli XADD stream_key 1-1 foo bar
"1-1"
$ redis-cli XADD stream_key 1-2 bar baz
"1-2"После этого отправит несколько команд XADD с некорректными идентификаторами, например 1-2 или 0-3.
# The exact time and sequence number as the last entry
$ redis-cli XADD stream_key 1-2 baz foo
(error) ERR The ID specified in XADD is equal or smaller than the target stream top item
# A smaller value for the time and a larger value for the sequence number
$ redis-cli XADD stream_key 0-3 baz foo
(error) ERR The ID specified in XADD is equal or smaller than the target stream top itemВ каждом случае сервер должен ответить -ERR The ID specified in XADD is equal or smaller than the target stream top item\r\n\ в формате простой ошибки.
Затем тест отправит ещё одну XADD с идентификатором 0-0.
$ redis-cli XADD stream_key 0-0 baz foo
(error) ERR The ID specified in XADD must be greater than 0-0Сервер должен ответить -ERR The ID specified in XADD must be greater than 0-0\r\n: сообщением об ошибке выше в формате простой ошибки.
Проверка в вашей 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 hq8Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.