Проектная лаборатория

Собственный Redis

0 / 124этапов пройдено

Этап 53 · Потоки

Блокирующее чтение без ограничения времени

Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.

На этом этапе вы добавите бессрочное блокирующее ожидание в XREAD.

Бессрочное ожидание в XREAD

Напомним, что XREAD поддерживает блокировку через параметр BLOCK <milliseconds>.

Если milliseconds равен 0, XREAD блокируется бессрочно, пока в поток или потоки не будет добавлена новая запись.

Рассмотрим двух отдельных клиентов. Первый отправляет блокирующую XREAD, указав время 0:

$ redis-cli XREAD BLOCK 0 streams some_key 1526985054069-0

Этот клиент останется заблокированным до появления новой записи.

Если второй клиент в любой момент добавит запись в поток:

$ other-redis-cli XADD some_key 1526985054079-0 temperature 37 humidity 94
"1526985054079-0"

Команда XREAD первого клиента сразу разблокируется и вернёт новую запись:

1) 1) "some_key"
   2) 1) 1) 1526985054079-0
         2) 1) temperature
            2) 37
            3) humidity
            4) 94

Тесты

Тестирующая программа запустит вашу программу так:

$ ./your_program.sh

Затем добавит запись в поток.

$ redis-cli XADD stream_key 0-1 temperature 96

После этого отправит серверу XREAD с бессрочным ожиданием:

$ redis-cli XREAD BLOCK 0 streams stream_key 0-1

Тест подождёт 1000 миллисекунд, чтобы убедиться, что клиент остаётся заблокированным и не завершается по тайм-ауту. Затем добавит ещё одну запись:

$ redis-cli XADD stream_key 0-2 temperature 95

Сервер должен вернуть следующий массив RESP:

[
  [
    "stream_key",
    [
      [
        "0-2",
        [
          "temperature",
          "95"
        ]
      ]
    ]
  ]
]

Проверка в вашей IDE

Нужны Node.js, Git, Go 1.24+ для тестеров и инструменты выбранного языка. Тестеры загружаются и запускаются локально; отдельным проектам нужны дополнительные системные зависимости.

Настройка проекта и IDE

1. Создайте проект один раз

node '/opt/graphlms/tools/project-lab/cli.mjs' init redis ./my-redis --language go

2. Откройте папку в IDE

cd ./my-redis

Реализуйте требования этапа в созданном проекте.

Запустите из папки проекта

node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage hw1

Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.

Результат проверки

go / ЛОКАЛЬНО

Подключение к локальной проверке…

Здесь появится результат

Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.

GraphLMS — инженерная лаборатория роста