Comment utiliser Redis Streams

Roshan Kumar est chef de produit senior chez Redis Labs.

Redis, la base de données multimodèle en mémoire, est populaire dans de nombreux cas d'utilisation. Celles-ci incluent la mise en cache de contenu, les magasins de session, l'analyse en temps réel, le courtage de messages et la diffusion de données. L'année dernière, j'ai écrit sur la façon d'utiliser Redis Pub / Sub, les listes et les ensembles triés pour le traitement de flux en temps réel. Désormais, avec l'arrivée de Redis 5.0, Redis dispose d'une toute nouvelle structure de données conçue pour gérer les flux.

Avec la structure de données Redis Streams, vous pouvez faire beaucoup plus que ce qui était possible avec Pub / Sub, Lists et Sorted Sets. Parmi les nombreux avantages, Redis Streams vous permet d'effectuer les opérations suivantes:

  • Collectez de gros volumes de données arrivant à grande vitesse (le seul goulot d'étranglement est votre réseau E / S);
  • Créer un canal de données entre de nombreux producteurs et de nombreux consommateurs;
  • Gérez efficacement votre consommation de données même lorsque les producteurs et les consommateurs ne fonctionnent pas au même rythme;
  • Conserver les données lorsque vos consommateurs sont hors ligne ou déconnectés;
  • Communiquer entre producteurs et consommateurs de manière asynchrone;
  • Échelle de votre nombre de consommateurs;
  • Mettre en œuvre la sécurité des données de type transaction lorsque les consommateurs échouent au milieu de la consommation de données; et
  • Utilisez efficacement votre mémoire principale.

La meilleure partie de Redis Streams est qu'il est intégré à Redis, il n'y a donc aucune étape supplémentaire requise pour déployer ou gérer Redis Streams. Dans cet article, je vais vous expliquer les bases de l'utilisation de Redis Streams. Nous verrons comment nous pouvons ajouter des données à un flux, et comment nous pouvons lire ces données (toutes à la fois, de manière asynchrone, à mesure qu'elles arrivent, etc.) pour satisfaire différents cas d'utilisation des consommateurs.

Dans deux prochains articles, je discuterai du fonctionnement des groupes de consommateurs de Redis Streams et je montrerai une application fonctionnelle qui utilise Redis Streams.

Comprendre le flux de données dans Redis Streams

Redis Streams fournit une structure de données «ajouter uniquement» qui ressemble aux journaux. Il propose des commandes qui vous permettent d'ajouter des sources aux flux, de consommer des flux et de surveiller et gérer la façon dont les données sont consommées. La structure de données Streams est flexible, vous permettant de connecter les producteurs et les consommateurs de plusieurs manières.

Redis Labs

La figure 1 illustre l'utilisation de base de Redis Streams. Un seul producteur agit comme une source de données et son consommateur est une application de messagerie qui envoie des données aux destinataires concernés.

Redis Labs

Dans la figure 2, un flux de données commun est consommé par plus d'un consommateur. Avec Redis Streams, les consommateurs peuvent lire et analyser les données à leur propre rythme.

Dans l'application suivante, illustrée à la figure 3, les choses deviennent un peu plus complexes. Ce service reçoit des données de plusieurs producteurs et les stocke toutes dans une structure de données Redis Streams. L'application a plusieurs consommateurs lisant les données de Redis Streams, ainsi qu'un groupe de consommateurs, qui prend en charge les consommateurs qui ne peuvent pas fonctionner au même rythme que les producteurs.

Redis Labs

Ajouter des données à un flux avec Redis Streams

Le diagramme de la figure 3 montre une seule façon d'ajouter des données à un flux Redis. Bien qu'un ou plusieurs producteurs puissent ajouter des données à la structure de données, toute nouvelle donnée est toujours ajoutée à la fin du flux.

La méthode par défaut pour ajouter des données

C'est le moyen le plus simple d'ajouter des données dans Redis Streams:

XADD mystream * nom Anna

XADD mystream * nom Bert

XADD mystream * nom Cathy

Dans cette commande, XADD est la commande Redis, mystream est le nom du flux, Anna, Bert et Cathy sont les noms ajoutés dans chaque ligne, et l'opérateur * dit à Redis de générer automatiquement l'identifiant pour chaque ligne. Cette commande génère trois entrées mystream:

1518951481323-0 nom Cathy

1518951480723-0 nom Bert

1518951480106-0 nom Anna

Ajout de données avec des ID gérés par l'utilisateur pour chaque entrée

Redis vous offre la possibilité de conserver votre propre identifiant pour chaque entrée (voir ci-dessous). Bien que cela puisse être utile dans certains cas, il est généralement plus simple de s'appuyer sur des ID générés automatiquement.

XADD mystream 10000000 nom Anna

XADD mystream 10000001 nom Bert

XADD mystream 10000002 nom Cathy

Cela entraîne les entrées mystream suivantes:

10000002-0 nom Cathy

10000001-0 nom Bert

10000000-0 nom Anna

Ajout de données avec une limite maximale

Vous pouvez limiter votre flux avec un nombre maximum d'entrées:

XADD mystream MAXLEN 1000000 * nom Anna

XADD mystream MAXLEN 1000000 * nom Bert

XADD mystream MAXLEN 1000000 * nom Cathy

Cette commande supprime les anciennes entrées lorsque le flux atteint une longueur d'environ 1 000 000.

Un conseil: Redis Streams stocke les données dans les nœuds de macro d'une arborescence de base. Chaque nœud de macro contient quelques éléments de données (généralement de l'ordre de quelques dizaines). L'ajout d'une valeur MAXLEN approximative comme indiqué ci-dessous évite d'avoir à manipuler le nœud macro pour chaque insertion. Si quelques dizaines de nombres - par exemple, que ce soit 1000000 ou 1000050 - font peu de différence pour vous, vous pouvez optimiser vos performances en appelant la commande avec le caractère d'approximation (~).

XADD mystream MAXLEN ~ 1000000 * nom Anna

XADD mystream MAXLEN ~ 1000000 * nom Bert

XADD mystream MAXLEN ~ 1000000 * nom Cathy

Consommer des données à partir d'un flux avec Redis Streams

La structure Redis Streams offre un riche ensemble de commandes et de fonctionnalités pour consommer vos données de différentes manières.

Tout lire depuis le début du flux

Situation: le flux contient déjà les données dont vous avez besoin pour traiter et vous souhaitez tout traiter depuis le début.

La commande que vous utiliserez pour cela est XREAD, qui vous permet de lire la totalité ou les N premières entrées depuis le début du flux. En tant que meilleure pratique, il est toujours judicieux de lire les données page par page. Pour lire jusqu'à 100 entrées à partir du début du flux, la commande est:

XREAD COUNT 100 STREAMS mystream 0

En supposant que 1518951481323-0 est le dernier ID de l'élément que vous avez reçu dans la commande précédente, vous pouvez récupérer les 100 entrées suivantes en exécutant:

XREAD COUNT 100 STREAMS mystream 1518951481323-1

Consommer des données de manière asynchrone (via un appel de blocage)

Situation: votre consommateur consomme et traite les données plus rapidement que la vitesse à laquelle les données sont ajoutées au flux.

Il existe de nombreux cas d'utilisation où le consommateur lit plus rapidement que les producteurs ajoutent des données à votre flux. Dans ces scénarios, vous voulez que le consommateur attende et soit averti lorsque de nouvelles données arrivent. L'option BLOC vous permet de spécifier la durée d'attente de nouvelles données: 

XREAD BLOCK 60000 STREAMS mystream 1518951123456-1

Ici, XREAD renvoie toutes les données après 1518951123456-1. S'il n'y a pas de données après cela, la requête attendra N = 60 secondes jusqu'à ce que de nouvelles données arrivent, puis expirera. Si vous souhaitez bloquer cette commande à l'infini, appelez XREAD comme suit:

XREAD BLOCK 0 STREAMS mystream 1518951123456-1 

Remarque : Dans cet exemple, vous pouvez également récupérer des données page par page à l'aide de la commande XRANGE. 

Lisez uniquement les nouvelles données dès leur arrivée

Situation: Vous souhaitez traiter uniquement le nouvel ensemble de données à partir du moment actuel.

Lorsque vous lisez des données à plusieurs reprises, c'est toujours une bonne idée de recommencer là où vous vous êtes arrêté. Par exemple, dans l'exemple précédent, vous avez effectué un appel de blocage pour lire des données supérieures à 1518951123456-1. Cependant, pour commencer, vous ne connaissez peut-être pas le dernier ID. Dans de tels cas, vous pouvez commencer à lire le flux avec le signe $, qui indique à la commande XREAD de récupérer uniquement les nouvelles données. Comme cet appel utilise l'option BLOCK avec 60 secondes, il attendra qu'il y ait des données dans le flux.

XREAD BLOCK 60000 STREAMS mystream $

Dans ce cas, vous commencerez à lire de nouvelles données avec l'option $. Cependant, vous ne devez pas effectuer d'appels ultérieurs avec l'option $. Par exemple, si 1518951123456-0 est l'ID des données récupérées lors des appels précédents, votre prochain appel doit être:

XREAD BLOCK 60000 STREAMS mystream 1518951123456-1

Itérer le flux pour lire les données passées

Situation: votre flux de données contient déjà suffisamment de données et vous souhaitez l'interroger pour analyser les données collectées jusqu'à présent.

Vous pouvez lire les données entre deux entrées dans le sens avant ou arrière en utilisant respectivement XRANGE et XREVRANGE. Dans cet exemple, la commande lit les données entre 1518951123450-0 et 1518951123460-0:

XRANGE mystream 1518951123450-0 1518951123460-0

XRANGE vous permet également de limiter le nombre d'articles retournés à l'aide de l'option COUNT. Par exemple, la requête suivante renvoie les 10 premiers éléments entre les deux intervalles. Avec cette option, vous pouvez parcourir un flux comme vous le faites avec la commande SCAN:

XRANGE mystream 1518951123450-0 1518951123460-0 COUNT 10

Lorsque vous ne connaissez pas la limite inférieure ou supérieure de votre requête, vous pouvez remplacer la limite inférieure par - et la limite supérieure par +. Par exemple, la requête suivante renvoie les 10 premiers éléments depuis le début de votre flux:

XRANGE mystream - + COUNT 10

La syntaxe de XREVRANGE est similaire à XRANGE, sauf que vous inversez l'ordre de vos limites inférieure et supérieure. Par exemple, la requête suivante renvoie les 10 premiers éléments de la fin de votre flux dans l'ordre inverse:

XREVRANGE mystream + - COUNT 10

Partitionner les données entre plusieurs consommateurs

Situation: les consommateurs consomment vos données beaucoup plus lentement que les producteurs ne les produisent.

Dans certains cas, y compris le traitement d'image, l'apprentissage en profondeur et l'analyse des sentiments, les consommateurs peuvent être très lents par rapport aux producteurs. Dans ces cas, vous faites correspondre la vitesse des données arrivant aux données consommées en déployant vos consommateurs et en partitionnant les données consommées par chacun.

Avec Redis Streams, vous pouvez utiliser des groupes de consommateurs pour ce faire. Lorsque plus d'un consommateur fait partie d'un groupe, Redis Streams veillera à ce que chaque consommateur reçoive un ensemble exclusif de données.

XREADGROUP GROUP mygroup consumer1 COUNT 2 STREAMS mystream>

Bien sûr, il y a beaucoup plus à apprendre sur le fonctionnement des groupes de consommateurs. Les groupes de consommateurs Redis Streams sont conçus pour partitionner les données, récupérer après une catastrophe et garantir la sécurité des données de transaction. J'expliquerai tout cela dans mon prochain article ici.

Comme vous pouvez le voir, il est facile de démarrer avec Redis Streams. Il suffit de télécharger et d'installer Redis 5.0 et de plonger dans le didacticiel Redis Streams sur le site Web du projet.

Roshan Kumar est chef de produit senior chez  Redis Labs . Il possède une vaste expérience dans le développement de logiciels et le marketing technologique. Roshan a travaillé chez Hewlett-Packard et de nombreuses startups à succès de la Silicon Valley, notamment ZillionTV, Salorix, Alopa et ActiveVideo. En tant que programmeur enthousiaste, il a conçu et développé mindzeal.com, une plateforme en ligne hébergeant des cours de programmation informatique pour les jeunes étudiants. Roshan est titulaire d'un baccalauréat en informatique et d'un MBA de l'Université de Santa Clara.

-

New Tech Forum offre un lieu pour explorer et discuter des technologies d'entreprise émergentes avec une profondeur et une ampleur sans précédent. La sélection est subjective, basée sur notre choix des technologies que nous pensons importantes et qui intéressent le plus les lecteurs. n'accepte pas les supports marketing pour la publication et se réserve le droit de modifier tout le contenu fourni. Envoyez toutes vos demandes à  [email protected] .