Redis Stream
Redis Stream — это структура данных, недавно добавленная в Redis версии 5.0.
Redis Stream в основном используется для очередей сообщений (MQ, Message Queue). В самом Redis есть функция публикации/подписки (pub/sub) для реализации функциональности очереди сообщений, но у неё есть недостаток: сообщения не могут быть сохранены. Если произойдёт разрыв сети, сбой Redis и т. п., сообщения будут отброшены.
Проще говоря, публикация/подписка (pub/sub) может распространять сообщения, но не может записывать исторические сообщения.
Redis Stream обеспечивает персистентность сообщений и репликацию master-slave, позволяя любому клиенту получать доступ к данным в любое время, а также запоминает позицию доступа каждого клиента и гарантирует, что сообщения не будут потеряны.
Структура Redis Stream показана ниже. Она имеет связный список сообщений, который связывает все добавленные сообщения воедино. Каждое сообщение имеет уникальный ID и соответствующее содержимое:

Каждый Stream имеет уникальное имя, которое является ключом Redis. Он создаётся автоматически, когда мы впервые используем команду xadd для добавления сообщения.
Пояснение к диаграмме:
- Группа потребителейГруппа потребителей, создаваемая с помощью команды XGROUP CREATE. В группе потребителей может быть несколько потребителей.
- last_delivered_idКурсор. У каждой группы потребителей есть курсор last_delivered_id. Когда любой потребитель читает сообщение, курсор last_delivered_id продвигается вперёд.
- pending_idsПеременная состояния потребителя, используемая для хранения неподтверждённых идентификаторов потребителя. pending_ids хранит сообщения, которые уже были прочитаны клиентом, но ещё не были подтверждены (acked, Acknowledge character: символ подтверждения).
Команды, связанные с очередями сообщений:
- XADD- Добавить сообщение в конец
- XTRIM- Обрезать поток, чтобы ограничить его длину
- XDEL- Удалить сообщение
- XLEN- Получить количество элементов, содержащихся в потоке, т. е. длину сообщения
- XRANGE- Получить список сообщений, который автоматически отфильтровывает удалённые сообщения
- XREVRANGE- Получить список сообщений в обратном порядке, ID от большего к меньшему
- XREAD- Получить список сообщений в блокирующем или неблокирующем режиме
Команды, связанные с группами потребителей:
- XGROUP CREATE- Создать группу потребителей
- XREADGROUP GROUP- Читать сообщения из группы потребителей
- XACK- Пометить сообщение как "обработанное"
- XGROUP SETID- Установить новый ID последнего доставленного сообщения для группы потребителей
- XGROUP DELCONSUMER- Удалить потребителя
- XGROUP DESTROY- Удалить группу потребителей
- XPENDING- Отобразить информацию о сообщениях, ожидающих обработки
- XCLAIM- Передать владение сообщением
- XINFO - Просмотреть информацию о потоках и группах потребителей;
- XINFO GROUPS- Вывести информацию о группах потребителей;
- XINFO STREAM- Вывести информацию о потоке
XADD
Используйте XADD для добавления сообщения в очередь. Если указанная очередь не существует, очередь будет создана. Формат синтаксиса XADD:
XADD key ID field value [field value ...]
- keyИмя очереди; создайте её, если она не существует
- IDИдентификатор сообщения. Мы используем * чтобы указать, что он генерируется Redis. Его можно задать самостоятельно, но необходимо обеспечить его возрастание.
- field valueЗапись.
Пример
"1601372323627-0"
redis> XADD mystream * field1 value1 field2 value2 field3 value3
"1601372323627-1"
redis> XLEN mystream
(целое число) 2
redis> XRANGE mystream - +
1) 1) "1601372323627-0"
2) 1) "name"
2) "Sara"
3) "surname"
4) "OConnor"
2) 1) "1601372323627-1"
2) 1) "field1"
2) "value1"
3) "field2"
4) "value2"
5) "field3"
6) "value3"
redis>
XTRIM
Используйте XTRIM, чтобы обрезать поток и ограничить его длину. Формат синтаксиса:
XTRIM key MAXLEN [~] count
- keyИмя очереди
- MAXLENДлина
- countКоличество
Пример
"1601372434568-0"
127.0.0.1:6379> XTRIM mystream MAXLEN 2
(целое число) 0
127.0.0.1:6379> XRANGE mystream - +
1) 1) "1601372434568-0"
2) 1) "field1"
2) "A"
3) "field2"
4) "B"
5) "field3"
6) "C"
7) "field4"
8) "D"
127.0.0.1:6379>
redis>
XDEL
Используйте XDEL для удаления сообщений. Формат синтаксиса:
XDEL key ID [ID ...]
- keyИмя очереди
- IDID сообщения
Пример
1538561698944-0
> XADD mystream * b 2
1538561700640-0
> XADD mystream * c 3
1538561701744-0
> XDEL mystream 1538561700640-0
(целое число) 1
127.0.0.1:6379> XRANGE mystream - +
1) 1) 1538561698944-0
2) 1) "a"
2) "1"
2) 1) 1538561701744-0
2) 1) "c"
2) "3"
XLEN
Используйте XLEN, чтобы получить количество элементов, содержащихся в потоке, то есть длину сообщения. Формат синтаксиса:
XLEN key
- keyИмя очереди
Пример
"1601372563177-0"
redis> XADD mystream * item 2
"1601372563178-0"
redis> XADD mystream * item 3
"1601372563178-1"
redis> XLEN mystream
(целое число) 3
redis>
XRANGE
Используйте XRANGE, чтобы получить список сообщений, который автоматически отфильтровывает удалённые сообщения. Формат синтаксиса:
XRANGE key start end [COUNT count]
- keyИмя очереди
- startНачальное значение,-представляет минимальное значение
- endКонечное значение,+представляет максимальное значение
- countКоличество
Пример
"1601372577811-0"
redis> XADD writers * name Jane surname Austen
"1601372577811-1"
redis> XADD writers * name Toni surname Morrison
"1601372577811-2"
redis> XADD writers * name Agatha surname Christie
"1601372577812-0"
redis> XADD writers * name Ngozi surname Adichie
"1601372577812-1"
redis> XLEN writers
(целое число) 5
redis> XRANGE writers - + COUNT 2
1) 1) "1601372577811-0"
2) 1) "name"
2) "Virginia"
3) "surname"
4) "Woolf"
2) 1) "1601372577811-1"
2) 1) "name"
2) "Jane"
3) "surname"
4) "Austen"
redis>
XREVRANGE
Используйте XREVRANGE, чтобы получить список сообщений, который автоматически отфильтровывает удалённые сообщения. Формат синтаксиса:
XREVRANGE key end start [COUNT count]
- keyИмя очереди
- endКонечное значение,+представляет максимальное значение
- startНачальное значение,-представляет минимальное значение
- countКоличество
Пример
"1601372731458-0"
redis> XADD writers * name Jane surname Austen
"1601372731459-0"
redis> XADD writers * name Toni surname Morrison
"1601372731459-1"
redis> XADD writers * name Agatha surname Christie
"1601372731459-2"
redis> XADD writers * name Ngozi surname Adichie
"1601372731459-3"
redis> XLEN writers
(целое число) 5
redis> XREVRANGE writers + - COUNT 1
1) 1) "1601372731459-3"
2) 1) "name"
2) "Нгози"
3) "surname"
4) "Адичи"
redis>
XREAD
Используйте XREAD, чтобы получить список сообщений в блокирующем или неблокирующем режиме. Формат синтаксиса:
XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id ...]
- countКоличество
- millisecondsНеобязательно. Миллисекунды блокировки. Если не задано, используется неблокирующий режим.
- keyИмя очереди
- idИдентификатор сообщения
Пример
> XREAD COUNT 2 STREAMS mystream writers 0-0 0-0
1) 1) "mystream"
2) 1) 1) 1526984818136-0
2) 1) "duration"
2) "1532"
3) "event-id"
4) "5"
5) "user-id"
6) "7782813"
2) 1) 1526999352406-0
2) 1) "duration"
2) "812"
3) "event-id"
4) "9"
5) "user-id"
6) "388234"
2) 1) "writers"
2) 1) 1) 1526985676425-0
2) 1) "name"
2) "Virginia"
3) "surname"
4) "Woolf"
2) 1) 1526985685298-0
2) 1) "name"
2) "Jane"
3) "surname"
4) "Austen"
XGROUP CREATE
Используйте XGROUP CREATE для создания группы потребителей. Формат синтаксиса:
XGROUP [CREATE key groupname id-or-$] [SETID key groupname id-or-$] [DESTROY key groupname] [DELCONSUMER key groupname consumername]
- keyИмя очереди; создайте её, если она не существует
- groupnameИмя группы.
- $Указывает на потребление с конца, принимаются только новые сообщения. Все текущие сообщения Stream будут проигнорированы.
Начать потребление с начала:
XGROUP CREATE mystream consumer-group-name 0-0
Начать потребление с конца:
XGROUP CREATE mystream consumer-group-name $
XREADGROUP GROUP
Используйте XREADGROUP GROUP для чтения сообщений из группы потребителей. Формат синтаксиса:
XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] ID [ID ...]
- groupИмя группы потребителей
- consumerИмя потребителя.
- countКоличество для чтения.
- millisecondsМиллисекунды блокировки.
- keyИмя очереди.
- IDID сообщения.
XREADGROUP GROUP consumer-group-name consumer-name COUNT 1 STREAMS mystream >Другие расширения