Проектная лаборатория
Собственный Redis
Этап 52 · Потоки
Блокирующее чтение
Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.
На этом этапе вы добавите блокирующее ожидание в XREAD.
Блокирующее ожидание в XREAD
По умолчанию XREAD работает синхронно: сразу возвращает доступные записи либо пустой ответ, если записей нет.
Необязательный параметр BLOCK позволяет клиентам ждать появления новых данных.
Синтаксис:
XREAD BLOCK <milliseconds> STREAMS <key> <id>Как это работает:
- Клиент отправляет команду и указывает время ожидания в миллисекундах.
- Если записи с идентификаторами больше указанного уже есть, команда сразу их возвращает.
- Если новых записей нет, команда блокируется и ждёт.
- Если до истечения времени в поток добавлена запись, команда разблокируется и возвращает новую запись или записи.
- Если время истекло, а новых данных нет, сервер отвечает нулевым массивом (
*-1\r\n).
Рассмотрим двух отдельных клиентов. Первый отправляет блокирующую XREAD:
$ redis-cli XREAD BLOCK 1000 streams some_key 1526985054069-0Теперь этот клиент заблокирован и ждёт новой записи.
Тем временем второй клиент может добавить запись в поток:
$ other-redis-cli XADD some_key 1526985054079-0 temperature 37 humidity 94
"1526985054079-0"Если запись добавлена в течение 1000 миллисекунд, XREAD первого клиента сразу разблокируется и вернёт новую запись:
1) 1) "some_key"
2) 1) 1) 1526985054079-0
2) 1) temperature
2) 37
3) humidity
4) 94Если же до истечения времени запись не появилась, команда завершится без данных и вернёт нулевой массив:
(nil)Тесты
Тестирующая программа запустит вашу программу так:
$ ./your_program.shЗатем добавит запись в поток.
$ redis-cli XADD stream_key 0-1 temperature 96После этого отправит серверу XREAD с параметром BLOCK.
$ redis-cli XREAD BLOCK 1000 streams stream_key 0-1Из другого экземпляра redis-cli тест добавит запись в течение 500 миллисекунд.
$ redis-cli XADD stream_key 0-2 temperature 95Сервер должен ответить первому клиенту следующим массивом RESP:
[
[
"stream_key",
[
[
"0-2",
[
"temperature",
"95"
]
]
]
]
]Затем тест отправит ещё одну блокирующую XREAD, но на этот раз дождётся полного истечения времени ожидания перед проверкой ответа.
$ redis-cli XREAD block 1000 streams stream_key 0-2В этом случае сервер должен вернуть нулевой массив (*-1\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 bs1Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.