Проектная лаборатория
Собственный Redis
Этап 83 · Списки
Блокирующее извлечение
Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.
На этом этапе вы добавите BLPOP, которая блокируется до появления доступного для извлечения элемента.
Команда BLPOP
BLPOP — блокирующий вариант LPOP. Она ждёт появления элемента в списке и затем извлекает его.
Если список пуст, команда блокируется, пока:
- В список не добавят новый элемент.
- Или не истечёт указанное время ожидания.
Если время равно 0, команда ждёт бессрочно.
Например, клиент может ждать элемент списка без ограничения времени так:
> BLPOP list_key 0Клиент будет ждать добавления элемента в list_key. Когда появится элемент, например "foobar", он удаляется из списка, а сервер отвечает массивом RESP:
1) "list_key"
2) "foobar"Массив RESP содержит две объёмные строки:
- Имя списка.
- Извлечённый элемент.
Другие особенности 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 go2. Откройте папку в IDE
cd ./my-redisРеализуйте требования этапа в созданном проекте.
Запустите из папки проекта
node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage ec3Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.