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

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

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

Этап 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 go

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

cd ./my-redis

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

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

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

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

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

go / ЛОКАЛЬНО

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

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

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

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