Cómo utilizar Redis Streams

Roshan Kumar es gerente de producto senior en Redis Labs.

Redis, la base de datos de múltiples modelos en memoria, es popular para muchos casos de uso. Estos incluyen almacenamiento en caché de contenido, almacenamiento de sesiones, análisis en tiempo real, intermediación de mensajes y transmisión de datos. El año pasado escribí sobre cómo usar Redis Pub / Sub, Lists y Sorted Sets para el procesamiento de transmisiones en tiempo real. Ahora, con la llegada de Redis 5.0, Redis tiene una estructura de datos completamente nueva diseñada para administrar flujos.

Con la estructura de datos de Redis Streams, puede hacer mucho más de lo que era posible con Pub / Sub, Lists y Sorted Sets. Entre los muchos beneficios, Redis Streams le permite hacer lo siguiente:

  • Recopile grandes volúmenes de datos que llegan a alta velocidad (el único cuello de botella es la E / S de su red);
  • Crear un canal de datos entre muchos productores y muchos consumidores;
  • Administre eficazmente su consumo de datos incluso cuando los productores y los consumidores no operen al mismo ritmo;
  • Conservar los datos cuando sus consumidores están desconectados o desconectados;
  • Comunicarse entre productores y consumidores de forma asincrónica;
  • Escale su número de consumidores;
  • Implementar seguridad de datos similar a la de las transacciones cuando los consumidores fallan en medio del consumo de datos; y
  • Utilice su memoria principal de manera eficiente.

La mejor parte de Redis Streams es que está integrado en Redis, por lo que no se requieren pasos adicionales para implementar o administrar Redis Streams. En este artículo, lo guiaré a través de los conceptos básicos del uso de Redis Streams. Veremos cómo podemos agregar datos a una transmisión y cómo podemos leer esos datos (todos a la vez, de forma asincrónica, a medida que llegan, etc.) para satisfacer diferentes casos de uso de consumidores.

En dos artículos futuros aquí, discutiré cómo funcionan los grupos de consumidores de Redis Streams y mostraré una aplicación de trabajo que usa Redis Streams.

Comprender el flujo de datos en Redis Streams

Redis Streams proporciona una estructura de datos de "solo adjuntar" que parece similar a los registros. Ofrece comandos que le permiten agregar fuentes a transmisiones, consumir transmisiones y monitorear y administrar cómo se consumen los datos. La estructura de datos de Streams es flexible, lo que le permite conectar productores y consumidores de varias formas.

Laboratorios Redis

La Figura 1 muestra el uso básico de Redis Streams. Un solo productor actúa como fuente de datos y su consumidor es una aplicación de mensajería que envía datos a los destinatarios relevantes.

Laboratorios Redis

En la Figura 2, más de un consumidor consume un flujo de datos común. Con Redis Streams, los consumidores pueden leer y analizar los datos a su propio ritmo.

En la siguiente aplicación, que se muestra en la Figura 3, las cosas se vuelven un poco más complejas. Este servicio recibe datos de varios productores y los almacena todos en una estructura de datos de Redis Streams. La aplicación tiene varios consumidores que leen los datos de Redis Streams, así como un grupo de consumidores, que apoya a los consumidores que no pueden operar al mismo ritmo que los productores.

Laboratorios Redis

Agregar datos a una transmisión con Redis Streams

El diagrama de la Figura 3 muestra solo una forma de agregar datos a Redis Stream. Aunque uno o más productores pueden agregar datos a la estructura de datos, cualquier dato nuevo siempre se agrega al final de la secuencia.

El método predeterminado para agregar datos

Esta es la forma más sencilla de agregar datos a Redis Streams:

XADD mystream * nombre Anna

XADD mystream * nombre Bert

XADD mystream * nombre Cathy

En este comando, XADD es el comando de Redis, mystream es el nombre de la secuencia, Anna, Bert y Cathy son los nombres agregados en cada línea, y el operador * le dice a Redis que genere automáticamente el identificador para cada línea. Este comando da como resultado tres entradas mystream:

1518951481323-0 nombre Cathy

1518951480723-0 nombre Bert

1518951480106-0 nombre Anna

Agregar datos con ID administrados por el usuario para cada entrada

Redis le ofrece la opción de mantener su propio identificador para cada entrada (ver más abajo). Si bien esto puede ser útil en algunos casos, generalmente es más sencillo confiar en las ID generadas automáticamente.

XADD mystream 10000000 nombre Anna

XADD mystream 10000001 nombre Bert

XADD mystream 10000002 nombre Cathy

Esto da como resultado las siguientes entradas de mystream:

10000002-0 nombre Cathy

10000001-0 nombre Bert

10000000-0 nombre Anna

Agregar datos con un límite máximo

Puede limitar su transmisión con un número máximo de entradas:

XADD mystream MAXLEN 1000000 * nombre Anna

XADD mystream MAXLEN 1000000 * nombre Bert

XADD mystream MAXLEN 1000000 * nombre Cathy

Este comando desaloja las entradas más antiguas cuando la secuencia alcanza una longitud de alrededor de 1.000.000.

Un consejo: Redis Streams almacena datos en los nodos macro de un árbol de base. Cada macronodo tiene algunos elementos de datos (normalmente, en el rango de unas pocas decenas). Agregar un valor MAXLEN aproximado como se muestra a continuación evita tener que manipular el macro nodo para cada inserción. Si unas pocas decenas de números, por ejemplo, ya sea 1000000 o 1000050, hacen poca diferencia para usted, puede optimizar su rendimiento llamando al comando con el carácter de aproximación (~).

XADD mystream MAXLEN ~ 1000000 * nombre Anna

XADD mystream MAXLEN ~ 1000000 * nombre Bert

XADD mystream MAXLEN ~ 1000000 * nombre Cathy

Consumir datos de una transmisión con Redis Streams

La estructura de Redis Streams ofrece un amplio conjunto de comandos y funciones para consumir sus datos de diversas formas.

Leer todo desde el principio de la transmisión

Situación: la transmisión ya tiene los datos que necesita procesar y desea procesarlos todos desde el principio.

El comando que usará para esto es XREAD, que le permite leer todas o las primeras N entradas desde el principio de la transmisión. Como práctica recomendada, siempre es una buena idea leer los datos página por página. Para leer hasta 100 entradas desde el principio de la secuencia, el comando es:

XREAD COUNT 100 STREAMS mystream 0

Suponiendo que 1518951481323-0 es el último ID del elemento que recibió en el comando anterior, puede recuperar las siguientes 100 entradas ejecutando:

XREAD COUNT 100 STREAMS mystream 1518951481323-1

Consumir datos de forma asincrónica (mediante una llamada de bloqueo)

Situación: su consumidor consume y procesa datos más rápido que la velocidad a la que se agregan los datos a la transmisión.

Hay muchos casos de uso en los que el consumidor lee más rápido de lo que los productores agregan datos a su transmisión. En estos escenarios, desea que el consumidor espere y se le notifique cuando lleguen nuevos datos. La opción BLOQUEAR le permite especificar el tiempo de espera para nuevos datos: 

XREAD BLOCK 60000 STREAMS mystream 1518951123456-1

Aquí, XREAD devuelve todos los datos posteriores a 1518951123456-1. Si no hay datos después de eso, la consulta esperará N = 60 segundos hasta que lleguen datos nuevos y luego expirará. Si desea bloquear este comando infinitamente, llame a XREAD de la siguiente manera:

XREAD BLOCK 0 STREAMS mystream 1518951123456-1 

Nota : En este ejemplo, también puede recuperar datos página por página utilizando el comando XRANGE. 

Leer solo los datos nuevos a medida que llegan

Situación: está interesado en procesar solo el nuevo conjunto de datos a partir del momento actual.

Cuando lee datos repetidamente, siempre es una buena idea reiniciar desde donde lo dejó. Por ejemplo, en el ejemplo anterior, realizó una llamada de bloqueo para leer datos superiores a 1518951123456-1. Sin embargo, para empezar, es posible que no conozca la identificación más reciente. En tales casos, puede comenzar a leer la secuencia con el signo $, que le dice al comando XREAD que recupere solo datos nuevos. Como esta llamada usa la opción BLOQUEAR con 60 segundos, esperará hasta que haya algunos datos en la secuencia.

XREAD BLOCK 60000 STREAMS mystream $

En este caso, comenzará a leer nuevos datos con la opción $. Sin embargo, no debe realizar llamadas posteriores con la opción $. Por ejemplo, si 1518951123456-0 es el ID de los datos recuperados en llamadas anteriores, su próxima llamada debería ser:

XREAD BLOCK 60000 STREAMS mystream 1518951123456-1

Itere la transmisión para leer datos anteriores

Situación: su flujo de datos ya tiene suficientes datos y desea consultarlos para analizar los datos recopilados hasta el momento.

Puede leer los datos entre dos entradas ya sea hacia adelante o hacia atrás usando XRANGE y XREVRANGE respectivamente. En este ejemplo, el comando lee datos entre 1518951123450-0 y 1518951123460-0:

XRANGE mystream 1518951123450-0 1518951123460-0

XRANGE también le permite limitar la cantidad de artículos devueltos con la ayuda de la opción COUNT. Por ejemplo, la siguiente consulta devuelve los primeros 10 elementos entre los dos intervalos. Con esta opción, puede iterar a través de una secuencia como lo hace con el comando SCAN:

XRANGE mystream 1518951123450-0 1518951123460-0 RECUENTO 10

Cuando no conoce el límite inferior o superior de su consulta, puede reemplazar el límite inferior por - y el límite superior por +. Por ejemplo, la siguiente consulta devuelve los primeros 10 elementos desde el principio de su transmisión:

XRANGE mystream - + COUNT 10

La sintaxis de XREVRANGE es similar a XRANGE, excepto que se invierte el orden de los límites inferior y superior. Por ejemplo, la siguiente consulta devuelve los primeros 10 elementos del final de su transmisión en orden inverso:

XREVRANGE mystream + - CUENTA 10

Partición de datos entre más de un consumidor

Situación: los consumidores consumen sus datos mucho más lento de lo que los productores los producen.

En ciertos casos, incluido el procesamiento de imágenes, el aprendizaje profundo y el análisis de sentimientos, los consumidores pueden ser muy lentos en comparación con los productores. En estos casos, usted hace coincidir la velocidad de los datos que llegan con los datos que se consumen al distribuir a sus consumidores y dividir los datos consumidos por cada uno.

Con Redis Streams, puede usar grupos de consumidores para lograr esto. Cuando más de un consumidor es parte de un grupo, Redis Streams se asegurará de que cada consumidor reciba un conjunto exclusivo de datos.

XREADGROUP GROUP mygroup consumidor1 COUNT 2 STREAMS mystream>

Por supuesto, hay mucho más que aprender sobre cómo funcionan los grupos de consumidores. Los grupos de consumidores de Redis Streams están diseñados para particionar datos, recuperarse de desastres y brindar seguridad en los datos de transacciones. Explicaré todo esto en mi próximo artículo aquí.

Como puede ver, es fácil comenzar con Redis Streams. Simplemente descargue e instale Redis 5.0 y sumérjase en el tutorial de Redis Streams en el sitio web del proyecto.

Roshan Kumar es gerente de producto senior en  Redis Labs . Tiene una amplia experiencia en desarrollo de software y marketing de tecnología. Roshan ha trabajado en Hewlett-Packard y en muchas empresas emergentes exitosas de Silicon Valley, incluidas ZillionTV, Salorix, Alopa y ActiveVideo. Como programador entusiasta, diseñó y desarrolló mindzeal.com, una plataforma en línea que alberga cursos de programación informática para estudiantes jóvenes. Roshan tiene una licenciatura en informática y un MBA de la Universidad de Santa Clara.

-

New Tech Forum proporciona un lugar para explorar y discutir la tecnología empresarial emergente con una profundidad y amplitud sin precedentes. La selección es subjetiva, basada en nuestra selección de las tecnologías que creemos que son importantes y de mayor interés para los lectores. no acepta material de marketing para su publicación y se reserva el derecho de editar todo el contenido contribuido. Envíe todas sus consultas a  [email protected] .