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

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

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

Этап 83 · Списки

Блокирующее извлечение

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

На этом этапе вы добавите BLPOP, которая блокируется до появления доступного для извлечения элемента.

Команда BLPOP

BLPOP — блокирующий вариант LPOP. Она ждёт появления элемента в списке и затем извлекает его.

Если список пуст, команда блокируется, пока:

  • В список не добавят новый элемент.
  • Или не истечёт указанное время ожидания.

Если время равно 0, команда ждёт бессрочно.

Например, клиент может ждать элемент списка без ограничения времени так:

> BLPOP list_key 0

Клиент будет ждать добавления элемента в list_key. Когда появится элемент, например "foobar", он удаляется из списка, а сервер отвечает массивом RESP:

1) "list_key"
2) "foobar"

Массив RESP содержит две объёмные строки:

  1. Имя списка.
  2. Извлечённый элемент.

Другие особенности BLPOP:

  • Если задано время ожидания, оно измеряется в секундах.
  • Если за это время не добавили ни одного элемента, сервер возвращает нулевой массив (*-1\r\n).
  • Если один список ждут несколько клиентов, сервер отвечает тому, кто ждёт дольше всех.

Тесты

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

./your_program.sh

Затем отправит BLPOP со временем ожидания 0:

$ redis-cli BLPOP list_key 0
# (Blocks)

Через небольшой промежуток другой клиент добавит элемент в тот же список:

# In another client:
$ redis-cli RPUSH list_key "foo"
# Expect: (integer) 1

Тест ожидает, что первый клиент немедленно получит ответ — массив ["list_key", "foo"] в RESP.

# RESP encoding of ["list_key", "foo"]
*2\r\n
$8\r\n
list_key\r\n
$3\r\n
foo\r\n

Тест также проверит BLPOP с несколькими ожидающими клиентами. Он создаст несколько клиентов, каждый из которых отправит BLPOP для одного списка.

# Client 1 sends BLPOP first
$ redis-cli BLPOP another_list_key 0
 
# Client 2 sends BLPOP second
$ redis-cli BLPOP another_list_key 0

Затем отдельный клиент добавит элемент через RPUSH.

$ redis-cli RPUSH another_list_key "foo"

Сервер должен ответить клиенту, отправившему BLPOP первым (Client 1).

Примечания

  • Пока время ожидания всегда будет 0, то есть BLPOP должна ждать бессрочно. Ненулевые значения появятся позже.

Проверка в вашей 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 ec3

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

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

go / ЛОКАЛЬНО

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

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

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

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