Последняя версия Redis, Redis 5.0 RC1, уже выпущена. Самая важная функция новой версии - Redis Streams. Давайте быстро посмотрим, что такое Redis Streams, и обсудим его приложения в реальных сценариях.

Что такое Redis Streams?

Redis Streams - это функция, которая планировалась много лет. Redis Streams изначально планировался для версии 4.0, но поскольку это относительно тяжелая функция и изменения ядра также относительно велики, она была перенесена на Redis 5.0.

Redis Streams - это, по сути, очередь сообщений, но она также уникальна по сравнению с другим промежуточным программным обеспечением для сообщений, таким как Kafka и RocketMQ. По своей природе это компонент публикации и подписки сообщений в ядре Redis (не модуль Redis).

Хотя существующие PUB / SUB и BLOCKED LIST могут использоваться в качестве службы очереди сообщений в простых сценариях, Redis Streams является более всеобъемлющим. Он обеспечивает постоянство сообщений и функции репликации данных ведущий / ведомый; он также имеет новую структуру данных RadixTree для поддержки более эффективного использования памяти и чтения сообщений. Redis Streams также поддерживает функцию, аналогичную Consumer Group Kafka.

В этой статье мы сосредоточимся на том, как использовать Redis Streams в практических бизнес-сценариях.

Redis Streams - Системы IRC

Я уверен, что большинство из вас знакомы с платформами Internet Relay Chat (IRC). Многие известные проекты с открытым исходным кодом (включая Redis) имеют свои собственные каналы IRC для удобного живого обмена идеями между разработчиками и пользователями. Интересно, что тема этой статьи, Redis Streams, возникла в результате обсуждения IRC!

Типичная модель IRC выглядит следующим образом:

Пользователь IRC-канала может отправлять и получать сообщения всем другим пользователям без ограничений. Чтобы создать IRC-систему на основе Redis, мы, естественно, будем думать о функции Redis PUB / SUB.

Мы видим, что при использовании функции PUB / SUB мы можем получать сообщения, отправленные всеми пользователями (клиентами), если все пользователи подписались на один и тот же канал IRC (channel1). Для отправки сообщений мы можем просто использовать publishcommand. Вся бизнес-логика очень ясна и понятна. Это также важная причина того, почему Redis так мощен и популярен - он предоставляет функции и структуры данных, которые значительно повышают эффективность разработчиков.

Однако IRC на основе PUB / SUB имеет проблему: PUB / SUB использует так называемую модель сообщений «выстрелил и забыл». То есть Redis не сохраняет историю сообщений.

Если пользователь в IRC-канале отключен из-за сбоя сети и позже снова присоединится к IRC-каналу, он не сможет видеть журнал чата за тот период, когда он был отключен. Новые пользователи также не могут видеть исторический журнал чата для последнего обсуждения. Это доставляет большие неудобства пользователям, которые хотят быстро разобраться в обсуждаемых на данный момент темах. Кроме того, при перезапуске Redis всем пользователям необходимо повторно подписаться на свои каналы.

Что, если мы создадим IRC-каналы на основе Redis Streams?

Создайте канал

# Currently Redis does not support creating empty streams. We can add a special message,
# to create a new stream (channel)
ip:7000> xadd channel1 * create-channel null
1528702126345-0

Отправлять сообщения

# Use the xadd command to send a message. We can name each message and attach the message source for business logic processing convenience.
# We can also send multiple messages at one time as this is helpful for optimizing network overhead.
ip:7000> xadd channel1 * msg1-tony "Hello everyone."
1528702503377-0
ip:7000> xadd channel1 * msg2-tony "I am a big Redis fan." msg3-tony "Hope we can learn from each other.:-)"
1528702573546-0

Получать сообщения

# If a new user joins a channel for the first time, "$" is specified as a special start ID for message reading. The user will then only receive the channel's latest messages.
# If there are new messages, the user will start reading the messages from the previous return result ID.
# If there are no new messages, the xread command returns an empty set
ip:7000> xread BLOCK 100 STREAMS channel1 $
1) 1) "channel1"
   2) 1) 1) 1528703048021-0
         2) 1) "msg1-tony"
            2) "Hello everyone."
ip:7000> xread BLOCK 100 STREAMS channel1 1528703048021-0
1) 1) "channel1"
   2) 1) 1) 1528703061087-0
         2) 1) "msg2-tony"
            2) "I am a big Redis fan."
            3) "msg3-tony"
            4) "Hope we can learn from each other.:-)"
ip:7000> xread BLOCK 100 STREAMS channel1 1528703061087-0
(nil)

Получить исторические сообщения

Мы упоминали, что важное различие между Redis Streams и PUB / SUB заключается в том, что Redis Streams позволяет пользователям получать исторические сообщения. Следовательно, если пользователь снова присоединяется к каналу IRC после отключения, можно использовать следующие методы, чтобы позволить этому пользователю получать исторические сообщения:

# 1528703061087-0 is the ID of the user's last received message
ip:7000> xrange channel1 1528703061087-0 +
1) 1) 1528706457462-0
   2) 1) "msg1-andy"
      2) "Nice to meet you guys."
2) 1) 1528706497200-0
   2) 1) "msg4-tony"
      2) "When will Redis 5.0 GA comes out?"
3) 1) 1528706601973-0
   2) 1) "msg1-antirez"
      2) "I think it will arrive in the second half of 2018."

Redis Streams - Подключения к данным Интернета вещей

Помимо мощной и обширной поддержки структур данных, Redis также важен для кроссплатформенных систем из-за его кроссплатформенной совместимости. Redis можно даже использовать как встроенную систему хранения для работы на платформе ARM. Redis может работать даже на Raspberry Pi.

В грядущую эпоху Интернета вещей (IoT) появится множество интеллектуальных устройств, готовых к подключению к Интернету в любое время и в любом месте. Например, бытовая техника будет подключена к вашему мобильному телефону. Ваш холодильник может сообщать о количестве и свежести продуктов; ваш кондиционер может сообщать вам температуру в помещении и качество воздуха; и ваш автомобиль может непрерывно сообщать вам различные параметры о вашем двигателе, вашей коробке передач и внутренней среде автомобиля. При таком большом количестве взаимодействующих устройств IoT это определенно создаст огромный поток данных. Эти данные будут собираться и анализироваться в облаке и потенциально могут принести огромную пользу пользователям.

Эти типы данных могут отличаться по разным аспектам; Сходство в том, что все такие данные являются данными временных рядов. Теперь вы можете внезапно вспомнить, что Redis Streams был разработан для поддержки данных временных рядов (см. Введение Redis Streams в первом разделе). Более того, Redis можно успешно запускать на устройствах ARM. Прогнозируется, что в будущем появятся триллионы устройств IoT на базе ARM. Таким образом, мы можем представить себе, что, помимо широкого применения в различных интернет-сервисах, таких как кэширование и хранилище KV, Redis вскоре будет процветать в индустрии Интернета вещей.

На приведенной выше диаграмме показана типичная архитектура сбора, анализа и отображения информации для устройств Интернета вещей. Redis работает на различных устройствах IoT как встроенная система хранения. Каждое устройство использует потоки Redis Streams для временного хранения сгенерированных данных временных рядов, а затем асинхронно отправляет их в облако. Затем бизнес-программы в облаке будут извлекать необработанные данные, анализировать данные на основе определенных правил и записывать результаты в надежные системы хранения данных. Наконец, пользователи получают результаты и отображают их в своих приложениях или на веб-страницах. В целом система образует замкнутый цикл.

Резюме

Redis Streams - одна из самых интересных функций Redis 5.0. Redis Streams чаще всего используется в индустрии Интернета вещей. Нет сомнений в том, что Redis Streams станет важным компонентом Четвертой промышленной революции (4IR).

Чтобы узнать больше о Redis в Alibaba Cloud, посетите страницу продукта ApsaraDB for Redis.

Ссылка:

Https://www.alibabacloud.com/blog/redis-streams-%E2%80%93-redis-5-0%27s-newest-data-type_593816?spm=a2c41.11774983.0.0