Как да използваме Redis Streams

Рошан Кумар е старши продуктов мениджър в Redis Labs.

Redis, базата данни с много модели в паметта, е популярна за много случаи на употреба. Те включват кеширане на съдържание, съхранение на сесии, анализ в реално време, посредничество на съобщения и поточно предаване на данни. Миналата година писах за това как да използвам Redis Pub / Sub, Lists и Sorted Sets за обработка на потоци в реално време. Сега, с пристигането на Redis 5.0, Redis има съвсем нова структура от данни, предназначена за управление на потоци.

Със структурата на данните Redis Streams можете да направите много повече от възможното с Pub / Sub, Lists и Sorted Sets. Сред многото предимства Redis Streams ви позволява да направите следното:

  • Събирайте големи обеми данни, пристигащи с висока скорост (единственото пречка е вашето мрежово I / O);
  • Създайте канал за данни между много производители и много потребители;
  • Ефективно управлявайте потреблението си на данни, дори когато производителите и потребителите не работят с еднаква скорост;
  • Постоянни данни, когато потребителите ви са офлайн или прекъснати;
  • Комуникирайте между производители и потребители асинхронно;
  • Мащабирайте своя брой потребители;
  • Прилагане на подобна на транзакцията безопасност на данните, когато потребителите се провалят по време на консумацията на данни; и
  • Използвайте ефективно основната си памет.

Най-добрата част от Redis Streams е, че е вградена в Redis, така че не са необходими допълнителни стъпки за разполагане или управление на Redis Streams. В тази статия ще ви преведа основите на използването на Redis Streams. Ще разгледаме как можем да добавяме данни към поток и как можем да ги четем (всички наведнъж, асинхронно, когато пристигнат и т.н.), за да задоволим различни случаи на потребителска употреба.

В две бъдещи статии тук ще обсъдя как работят потребителските групи на Redis Streams и ще покажа работещо приложение, което използва Redis Streams.

Разберете потока от данни в Redis Streams

Redis Streams предоставя структура на данни „само добавяне“, която изглежда подобна на регистрационните файлове. Той предлага команди, които ви позволяват да добавяте източници към потоци, да консумирате потоци и да наблюдавате и управлявате как се консумират данните. Структурата на данните Streams е гъвкава, което ви позволява да свързвате производители и потребители по няколко начина.

Лаборатории Redis

Фигура 1 демонстрира основното използване на Redis Streams. Един производител действа като източник на данни, а неговият потребител е приложение за съобщения, което изпраща данни до съответните получатели.

Лаборатории Redis

На фигура 2 общ поток от данни се консумира от повече от един потребител. С Redis Streams потребителите могат да четат и анализират данните със свое собствено темпо.

В следващото приложение, показано на фигура 3, нещата стават малко по-сложни. Тази услуга получава данни от множество производители и ги съхранява в структурата от данни на Redis Streams. Приложението има множество потребители, които четат данните от Redis Streams, както и потребителска група, която поддържа потребители, които не могат да работят със същата скорост като производителите.

Лаборатории Redis

Добавете данни към поток с Redis Streams

Диаграмата на фигура 3 показва само един начин за добавяне на данни към Redis Stream. Въпреки че един или повече производители могат да добавят данни към структурата на данните, всички нови данни винаги се добавят в края на потока.

Методът по подразбиране за добавяне на данни

Това е най-простият начин за добавяне на данни в Redis Streams:

XADD mystream * име Анна

XADD mystream * име Bert

XADD mystream * име Кати

В тази команда XADD е командата Redis, mystream е името на потока, Anna, Bert и Cathy са имената, добавени във всеки ред, а операторът * казва на Redis да генерира автоматично идентификатора за всеки ред. Тази команда води до три записа в mystream:

1518951481323-0 име Кати

1518951480723-0 име Bert

1518951480106-0 име Анна

Добавяне на данни с управлявани от потребителя идентификатори за всеки запис

Redis ви дава възможност да поддържате свой собствен идентификатор за всеки запис (вижте по-долу). Въпреки че това може да е полезно в някои случаи, обикновено е по-просто да се разчита на автоматично генерирани идентификатори.

XADD mystream 10000000 име Анна

XADD mystream 10000001 име Bert

XADD mystream 10000002 име Cathy

Това води до следните записи в mystream:

10000002-0 име Кати

10000001-0 име Bert

10000000-0 име Анна

Добавяне на данни с максимално ограничение

Можете да ограничите потока си с максимален брой записи:

XADD mystream MAXLEN 1000000 * име Анна

XADD mystream MAXLEN 1000000 * име Bert

XADD mystream MAXLEN 1000000 * име Cathy

Тази команда изхвърля по-стари записи, когато потокът достигне дължина от около 1 000 000.

Съвет: Redis Streams съхранява данни в макро възлите на дърво radix. Всеки макро възел има няколко елемента от данни (обикновено в диапазона от няколко десетки). Добавянето на приблизителна стойност MAXLEN, както е показано по-долу, избягва да се налага да се манипулира макро възела за всяко вмъкване. Ако няколко десетки числа - напр. Независимо дали са 1000000 или 1000050 - ви правят малка разлика, можете да оптимизирате ефективността си, като извикате командата със знака за приближение (~).

XADD mystream MAXLEN ~ 1000000 * име Анна

XADD mystream MAXLEN ~ 1000000 * име Bert

XADD mystream MAXLEN ~ 1000000 * име Кати

Консумирайте данни от поток с Redis Streams

Структурата на Redis Streams предлага богат набор от команди и функции за консумация на вашите данни по различни начини.

Прочетете всичко от началото на потока

Ситуация: Потокът вече има данните, които трябва да обработите и искате да ги обработите от самото начало.

Командата, която ще използвате за това, е XREAD, която ви позволява да прочетете всички или първите N записи от началото на потока. Като най-добра практика винаги е добра идея да четете данните страница по страница. За да прочетете до 100 записа от началото на потока, командата е:

XREAD COUNT 100 ПОТОКА mystream 0

Ако приемем, че 1518951481323-0 е последният идентификатор на елемента, който сте получили в предишната команда, можете да извлечете следващите 100 записа, като изпълните:

XREAD COUNT 100 ПОТОКА mystream 1518951481323-1

Консумирайте данни асинхронно (чрез блокиращо повикване)

Ситуация: Вашият потребител консумира и обработва данни по-бързо от скоростта, с която данните се добавят към потока.

Има много случаи на използване, при които потребителят чете по-бързо, отколкото производителите добавят данни към вашия поток. В тези сценарии искате потребителят да изчака и да бъде уведомен, когато пристигнат нови данни. Опцията BLOCK ви позволява да посочите продължителността на времето за изчакване на нови данни: 

XREAD BLOCK 60000 ПОТОКА mystream 1518951123456-1

Тук XREAD връща всички данни след 1518951123456-1. Ако няма данни след това, заявката ще изчака N = 60 секунди, докато пристигнат нови данни, и след това изтече времето за изчакване. Ако искате да блокирате тази команда безкрайно, извикайте XREAD, както следва:

XREAD BLOCK 0 ПОТОКА mystream 1518951123456-1 

Забележка : В този пример можете също да извличате данни страница по страница, като използвате командата XRANGE. 

Четете само нови данни при получаването им

Ситуация: Интересувате се да обработвате само новия набор от данни, започвайки от текущия момент във времето.

Когато четете данни многократно, винаги е добра идея да рестартирате там, където сте спрели. Например в предишния пример сте направили блокиращо повикване за четене на данни, по-големи от 1518951123456-1. За начало обаче може да не знаете най-новия идентификатор. В такива случаи можете да започнете да четете потока със знака $, който казва на командата XREAD да извлича само нови данни. Тъй като това обаждане използва опцията BLOCK с 60 секунди, то ще изчака, докато има някои данни в потока.

XREAD BLOCK 60000 ПОТОКА mystream $

В този случай ще започнете да четете нови данни с опцията $. Не трябва обаче да правите последващи обаждания с опцията $. Например, ако 1518951123456-0 е идентификаторът на данните, извлечени при предишни обаждания, следващото ви повикване трябва да бъде:

XREAD BLOCK 60000 ПОТОКА mystream 1518951123456-1

Итерирайте потока, за да прочетете минали данни

Ситуация: Вашият поток от данни вече има достатъчно данни и искате да го направите, за да анализирате събраните до момента данни.

Можете да четете данните между два записа в посока напред или назад, като използвате съответно XRANGE и XREVRANGE. В този пример командата чете данни между 1518951123450-0 и 1518951123460-0:

XRANGE mystream 1518951123450-0 1518951123460-0

XRANGE също ви позволява да ограничите броя на върнатите елементи с помощта на опцията COUNT. Например, следващата заявка връща първите 10 елемента между двата интервала. С тази опция можете да итерирате през поток, както правите с командата SCAN:

XRANGE mystream 1518951123450-0 1518951123460-0 БРОЙ 10

Когато не знаете долната или горната граница на заявката си, можете да замените долната граница с - и горната граница с +. Например следната заявка връща първите 10 елемента от началото на потока ви:

XRANGE mystream - + БРОЙ 10

Синтаксисът за XREVRANGE е подобен на XRANGE, с изключение на това, че обръщате реда на долната и горната граница. Например следната заявка връща първите 10 елемента от края на потока ви в обратен ред:

XREVRANGE mystream + - БРОЙ 10

Данни за разделяне между повече от един потребител

Ситуация: Потребителите консумират вашите данни далеч по-бавно, отколкото производителите ги произвеждат.

В определени случаи, включително обработка на изображения, задълбочено обучение и анализ на настроенията, потребителите могат да бъдат много бавни в сравнение с производителите. В тези случаи съпоставяте скоростта на пристигането на данните с консумираните данни, като раздухвате потребителите си и разделяте данните, консумирани от всеки един.

С Redis Streams можете да използвате потребителски групи, за да постигнете това. Когато повече от един потребител е част от група, Redis Streams ще гарантира, че всеки потребител получава изключителен набор от данни.

XREADGROUP GROUP mygroup потребител1 БРОЙ 2 ПОТОКА mystream>

Разбира се, има още много какво да научите за това как работят потребителските групи. Потребителските групи на Redis Streams са предназначени за разделяне на данни, възстановяване след бедствия и осигуряване на безопасност на данните за транзакциите. Ще обясня всичко това в следващата ми статия тук.

Както можете да видите, лесно е да започнете с Redis Streams. Просто изтеглете и инсталирайте Redis 5.0 и се потопете в урока за Redis Streams на уебсайта на проекта.

Рошан Кумар е старши продуктов мениджър в  Redis Labs . Притежава богат опит в разработването на софтуер и технологичния маркетинг. Рошан е работил в Hewlett-Packard и много успешни стартиращи компании в Силициевата долина, включително ZillionTV, Salorix, Alopa и ActiveVideo. Като ентусиазиран програмист, той проектира и разработи mindzeal.com, онлайн платформа, хостваща курсове по компютърно програмиране за млади студенти. Рошан има бакалавърска степен по компютърни науки и MBA от университета Санта Клара.

-

Форумът New Tech предоставя място за изследване и обсъждане на нововъзникващите корпоративни технологии в безпрецедентна дълбочина и широчина. Изборът е субективен, базиран на нашия избор на технологиите, които смятаме, че са важни и представляват най-голям интерес за читателите. не приема маркетингово обезпечение за публикуване и си запазва правото да редактира цялото съдържание. Изпращайте всички запитвания на  [email protected] .