Быть в курсе
Аватарка автора Редакция Рег.облако
Облако

Настройка очередей задач в Redis

27 октября 2025

11 минут

Телеграм

ВКонтакте

Redis — это современная высокопроизводительная система управления базами данных, которая полностью работает в оперативной памяти и часто используется как сервер структур данных. Он поддерживает не только стандартные типы, вроде строк, но и такие структуры, как списки, множества, хэши и потоки.

Благодаря этому Redis применяют для кэширования, организации сессий, хранения лидеров в игровых таблицах, а также для построения очередей сообщений и фоновых задач.

В работе с веб-приложениями, микросервисами и IoT-решениями часто возникает задача — быстро и надежно организовать передачу задач между разными компонентами системы. Redis отлично подходит для таких случаев благодаря:

  • мгновенному доступу к данным и операциям в реальном времени;
  • поддержке разнообразных структур для разных сценариев работы с очередями;
  • наличию встроенной авторизации;
  • возможности кластеризации, которая позволяет использовать Redis в распределенных системах;
  • простому масштабированию и высокой отказоустойчивости;
  • большому сообществу и наличию готовых библиотек для популярных языков программирования.

В этой статье мы подробно разберем, как подготовить окружение для работы с Redis и реализовать очереди задач разными способами.

Источник: Freepik. Redis отлично подходит для передачи задач между разными компонентами системы

Способы для настройки очередей задач в Redis

Redis не предоставляет встроенного механизма «очередей задач» в привычном смысле, как, например, RabbitMQ или Kafka. Но благодаря своей универсальности и скорости позволяет реализовать очередь вручную — разными способами и под разные задачи:

  • Pub/Sub (публикация-подписка) — классическая модель обмена сообщениями, при которой один или несколько отправителей публикуют данные в канал, а все подписчики, подключенные в этот момент, немедленно их получают. Сообщения не сохраняются: если в момент публикации никто не подписан на канал, данные теряются без возможности восстановления.
  • List (список) — это простая и популярная структура данных, которую можно использовать для реализации очереди по принципу FIFO: первым вошел — первым вышел. Сообщения в такой очереди хранятся в Redis до тех пор, пока не будут обработаны. Благодаря этому задачи не теряются даже в случае, если обработчик временно недоступен, — они просто ждут своей очереди, чтобы быть извлеченными и выполненными.
  • Stream (потоки) — современный и продвинутый способ, которые позволяет работать с большими объемами событий, хранить историю сообщений, управлять группами потребителей и отслеживать, какие сообщения уже были обработаны.

Технологии очередей позволяют создавать real-time сервисы, чаты, системы аналитики. В Рег.облаке вы можете быстро поднять окружение и протестировать такие сценарии без лишних затрат.

Как реализовать и настроить очередь в Redis

Разберемся, как на практике организовать передачу и обработку задач с помощью различных инструментов Redis:

Способ 1. На основе Pub/Sub

Один из простых и удобных способов организовать обмен сообщениями между разными частями приложения — использовать механизм публикации и подписки (Pub/Sub) в Redis. Он подходит для сценариев, где важна доставка событий в моменте, например, для уведомлений, передачи сигналов между сервисами или push-сообщений в чатах.

В рабочем каталоге создайте файл:

Этот скрипт будет получать сообщения из определенных каналов Redis:

Здесь обработчик подключается к Redis и подписывается на два канала — news и alerts. В бесконечном цикле скрипт проверяет, не появилось ли новое сообщение, и, если оно есть, выводит его в консоль.

Теперь создадим второй файл — отправитель, который будет публиковать сообщения в выбранные каналы. Назовем его, например, publisher_pubsub.py:

Скрипт отправителя выглядит так:

Здесь все просто — скрипт подключается к Redis и отправляет одно сообщение в канал updates, другое — в канал alerts.

Сначала запустите подписчика (слушателя каналов) в одном терминале:

Затем — в другом терминале:

В первом терминале увидите вывод примерно такого вида:

[updates]: Сервис обновлен и готов к работе
[alerts]: Внимание: обнаружена новая задача!

Источник: Freepik. Отправку push-сообщений в чатах можно реализовать с помощью мехиназма Pub/Sub

Способ 2. На основе List

Еще один вариант реализации очереди в Redis — использовать тип данных List. Его часто применяют для классических сценариев: элемент добавляется в очередь, обрабатывается и затем удаляется.

Задачи хранятся в обычном Redis‑списке и обрабатывается по принципу FIFO — первым обрабатывается то, что было добавлено раньше. В этой схеме участвуют два основных компонента: издатель (publisher) и подписчик (subscriber). Издатель отвечает за постановку задач в очередь — он формирует сообщение и добавляет его в список. Подписчик, в свою очередь, следит за очередью, извлекает новые задачи и выполняет их.

Сначала реализуйте подписчика (subscriber_list.py), который будет забирать задачи из списка task_queue и обрабатывать их:

Скрипт:

Здесь используется метод rpop, который извлекает элементы из конца списка, обеспечивая тем самым правильный порядок обработки задач — первым обработается то сообщение, которое первым было добавлено. Между обработкой задач добавлена небольшая задержка, чтобы снизить нагрузку на сервер.

Теперь создадим издателя (publisher_list.py), который формирует и помещает задачи в очередь:

Пропишите в нем:

Сообщения помещаются в начало списка с помощью lpush. Для наглядности каждому сообщению присваивается случайный номер задачи, чтобы можно было увидеть их порядок обработки.

Запустите подписчика:

В новом окне терминала запустите издателя:

На стороне подписчика вы увидите примерно такой вывод:

Ожидание задач…
обработано: Task-7421
обработано: Task-3914
обработано: Task-5842
обработано: Task-1580
обработано: Task-9037

Источник: Freepik. В Stream есть встроенные инструменты для работы с сообщениями

Способ 3. На основе Stream

Streams — тип структуры данных, который представляет собой упорядоченную последовательность записей (сообщений). Каждая из них автоматически получает уникальный идентификатор (ID). Их часто называют «потоками» или «логами событий».

В отличие от Pub/Sub, где сообщения не сохраняются для поздних подписчиков, и List, где нужно вручную следить за удалением, Stream предоставляет встроенные инструменты:

  • XADD для добавления новых записей в конец потока;
  • XLEN для получения длины потока;
  • XREAD для чтения записей начиная с заданного ID (с возможностью блокировать до появления новых данных);
  • XRANGE и XREVRANGE для выборки диапазона записей по ID.

Сначала создайте скрипт-издатель, который будет добавлять записи в поток task_stream:

Непосредственно скрипт:

Каждая запись состоит из пары полей: уникального task_id и строки action. После отправки всех задач вы получите длину потока через XLEN, чтобы убедиться, что сообщения дошли.

Далее напишите простой скрипт-подписчик subscriber_stream.py, который при каждом запуске читает все содержимое потока:

Скрипт:

При первом запуске вы получите список всех сообщений, и каждый элемент будет представлен в виде [stream_name, [(message_id, {…}), …]]. Но при повторном запуске вам придется снова прочитать те же записи, что не всегда удобно при обработке уникальных событий.

Чтобы читать только новые записи, сохраните ID последней обработанной записи в отдельном ключе Redis last_id и используйте его при последующих вызовах XREAD:

Теперь при первом старте скрипт прочитает все существующие записи, а при следующих запусках — только те, что появились после last_id.

Заключение

В этой статье мы рассмотрели три основных способа организации очередей задач в Redis: Pub/Sub, List и Stream. Приведенные примеры показывают базовые принципы работы с очередями, но в реальных проектах обычно нужно дорабатывать эти решения — добавлять обработку ошибок, контролировать повторную обработку сообщений, обеспечивать устойчивость к сбоям и внедрять дополнительные бизнес-правила.

Как правило, очередь становится частью отдельного слоя или внутренней библиотеки проекта, а ее структура и поведение подстраиваются под нужды конкретной системы. Поэтому при внедрении очередей важно учитывать специфику задачи, а также возможности и ограничения каждого подхода.

Новые статьи