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