Listas Redis y casos de uso comunes

Listas Redis

En lo que se refiere a las listas Redis, para explicar el tipo de datos de la Lista, es mejor comenzar con un poco de teoría, ya que el término Lista a menudo se usa de forma incorrecta por gente de la tecnología de la información.

Por ejemplo, “Listas de Python” no son lo que su nombre puede sugerir (Listas Enlazadas), sino Arrays (el mismo tipo de datos se llama Array en Ruby en realidad). 

Desde un punto de vista muy general, una Lista es solo una secuencia de elementos ordenados: 10,20,1,2,3 es una lista.

Pero las propiedades de una lista implementada usando una matriz son muy diferentes de las propiedades de una lista implementada usando una lista enlazada.

Las listas Redis se implementan mediante listas vinculadas. Esto significa que incluso si tiene millones de elementos dentro de una lista, la operación de agregar un nuevo elemento en la cabecera o en la cola de la lista se realiza en tiempo constante.

La velocidad de agregar un nuevo elemento con el comando LPUSH al encabezado de una lista con diez elementos es lo mismo que agregar un elemento al encabezado de la lista con 10 millones de elementos. 


¿Cuál es el inconveniente?

El acceso a un elemento por índice es muy rápido en listas Redis implementadas con una matriz (acceso indexado de tiempo constante) y no tan rápido en listas Redis implementadas por listas vinculadas (donde la operación requiere una cantidad de trabajo proporcional al índice del elemento accedido). 

Las listas Redis rojas se implementan con listas vinculadas porque para un sistema de base de datos es crucial poder agregar elementos a una lista muy larga de una manera muy rápida.

Otra gran ventaja, como verá en un momento, es que las listas Redis se pueden tomar con una longitud constante en tiempo constante. 

Cuando el acceso rápido al centro de una gran colección de elementos es importante, existe una estructura de datos diferente que se puede usar, llamada conjuntos ordenados. Los conjuntos ordenados se tratarán más adelante en este tutorial.

Primeros pasos con Listas Redis

El comando LPUSH agrega un nuevo elemento a una lista, a la izquierda (en la cabecera), mientras que el comando RPUSH agrega un nuevo elemento a una lista, a la derecha (en la cola).

Finalmente, el comando LRANGE extrae rangos de elementos de las listas Redis :

> rpush mylist A
(integer) 1
> rpush mylist B
(integer) 2
> lpush mylist first
(integer) 3
> lrange mylist 0 -1
1) "first"
2) "A"
3) "B"

Tenga en cuenta que LRANGE toma dos índices, el primero y el último elemento del rango a devolver.

Ambos índices pueden ser negativos e indican a Redis que comience a contar desde el final: entonces, -1 es el último elemento, -2 es el penúltimo elemento de la lista, y así sucesivamente.

Como puede ver, RPUSH agregó los elementos a la derecha de la lista, mientras que el LPUSH final adjuntó el elemento de la izquierda.

Ambos comandos son comandos variados, lo que significa que puede insertar múltiples elementos en una lista en una sola llamada:

> rpush mylist 1 2 3 4 5 "foo bar"
(integer) 9
> lrange mylist 0 -1
1) "first"
2) "A"
3) "B"
4) "1"
5) "2"
6) "3"
7) "4"
8) "5"
9) "foo bar"

Una operación importante definida en las listas Redis es la capacidad de mostrar elementos. Los elementos emergentes son la operación de recuperar el elemento de la lista y eliminarlo de la lista al mismo tiempo.

Puede mostrar elementos de izquierda a derecha, de forma similar a cómo puede insertar elementos en ambos lados de la lista:

> rpush mylist a b c
(integer) 3
> rpop mylist
"c"
> rpop mylist
"b"
> rpop mylist
"a"

Añadimos tres elementos y aparecieron tres elementos, por lo que al final de esta secuencia de comandos, la lista está vacía y no hay más elementos para mostrar.

Si tratamos de mostrar otro elemento más, este es el resultado que obtenemos:

> rpop mylist
(nil)

Redis devolvió un valor NULL para indicar que no hay elementos en la lista.

Casos de uso comunes para listas Redis

Las listas Redis son útiles para una serie de tareas, dos casos de uso muy representativos son los siguientes:

Recuerde las últimas actualizaciones publicadas por los usuarios en una red social.

La comunicación entre procesos, utilizando un patrón consumidor-productor donde el productor inserta elementos en una lista, y un consumidor (generalmente un trabajador) consume esos artículos y ejecuta acciones. Redis tiene comandos de lista especiales para hacer que este caso de uso sea más confiable y eficiente.

Por ejemplo, tanto las bibliotecas populares de Ruby resque como sidekiq usan listas Redis bajo el capó para implementar tareas en segundo plano.

La popular red social de Twitter toma los últimos tweets publicados por los usuarios en las listas Redis . Para describir paso a paso un caso de uso común, imagine que su página de inicio muestra las últimas fotos publicadas en una red social para compartir fotos y desea acelerar el acceso.

Cada vez que un usuario publica una nueva foto, agregamos su ID a una lista con LPUSH.

Cuando los usuarios visitan la página de inicio, utilizamos LRANGE 0 9 para obtener los últimos 10 artículos publicados.

Listas limitadas

En muchos casos de uso, solo queremos usar listas para almacenar los últimos artículos, sean lo que sean: actualizaciones de redes sociales, registros o cualquier otra cosa, si desea conocer más puedes leer: Lista Redis limitada

Bloqueo de operaciones en listas

Las listas tienen una característica especial que las hace adecuadas para implementar colas y, en general, como un bloque de construcción para los sistemas de comunicación entre procesos: operaciones de bloqueo.

Para ver los principales comandos de bloqueos de operaciones en listas te recomendamos leer: Bloqueo de operaciones en Redis

A continuación te acercamos un listado de diversos posts de Redis, para que puedas continuar leyendo sobre el tema:

Dejá un comentario