Estructuras de datos en Redis

En el post anterior sobre Redis hablamos de varios casos de uso en los que Redis nos puede ayudar, y también vimos cómo algunas de las mayores empresas del mundo están utilizando este almacén clave-valor para dar solución a problemas de negocio reales.

Redis es muy popular debido a la velocidad a la que podemos almacenar y recuperar información, pero tal y como decíamos, una de las ventajas por las que Redis es tan socorrido es gracias a las diversas estructuras de datos que permite manejar. En esta entrada vamos a dar un breve repaso a dichas clases de estructuras de datos.

redis Key 300

¿Qué tipos de datos puedo asociar a una clave?  

Para dar respuesta a los retos planteados por el negocio, Redis nos permite modelar la información usando las siguientes estructuras de datos que puede reconocer:

  • Strings: 

Es el tipo de datos básico de las bases de datos clave-valor y el más simple de los soportados. En Redis un string es una secuencia de bytes, lo que nos permite almacenar cualquier dato, como cadenas de texto, números, imágenes, vídeos, o un objeto serializado.

La información almacenada es opaca para la BBDD, lo que significa que ésta no tiene noción de la estructura de la información, ni tiene capacidad para operar sobre ella. Una excepción notable a esto último es que Redis es capaz de interpretar valores numéricos y puede llevar a cabo operaciones de incremento/decremento de manera atómica sobre los mismos. Esto nos permite utilizarlo para generar identificadores únicos desde múltiples clientes, o en general para casos de uso en los que se requieran contadores, como contabilizar votos de usuarios, visualizaciones de productos, cantidades compradas de un artículo, visitas a una página, etc.

En resumen, podemos usar los strings para almacenar y recuperar información como sesiones de usuario, carritos de la compra, contadores, caché de HTML, caché de consultas a BBDD o llamadas a un API, y en general objetos serializados en XML, JSON o cualquier otro formato.

  • Listas: 

Las listas permiten almacenar secuencias de strings en el orden en el que fueron insertadas. En Redis las listas están optimizadas para que añadir un elemento al inicio o al final de la lista tarde lo mismo independientemente de si la lista tiene 10 elementos, o 100 millones de elementos.

Las listas permiten casos de uso del tipo “muéstrame las últimas n actualizaciones de algo”. Las listas en Redis también se usan para implementar sistemas del tipo productor-consumidor, en los que un proceso añade tareas a la lista, y uno o más procesos sacan dichas tareas de la lista para llevarlas a cabo. Disponemos además de la capacidad de limitar el número de elementos de una lista.

  • Sets:

Los sets son colecciones de strings, sin ningún orden particular, en los que se garantiza que los elementos del mismo son únicos y no pueden estar duplicados. Podemos añadir el mismo elemento 10 veces, pero Redis garantiza que sólo existirá una vez, lo que nos permite poder añadir elementos sin tener que preocuparnos previamente de si ya existen o no.

Las operaciones de añadir elementos al set, comprobar si un elemento existe, y eliminar elementos son muy rápidas. Redis permite además llevar a cabo operaciones de unión, intersección y diferencia entre los elementos de varios conjuntos.

  • Sorted Sets: 

Son conjuntos agrupados con las propiedades de estos sets, que además permiten la ordenación de los elementos en base a un valor (score) numérico asociado a cada uno de ellos. Es importante aclarar que la unicidad de los elementos se hace sólo teniendo en cuenta los datos almacenados, y no el valor del score. Si se añade el mismo elemento varias veces con distintos valores del score, el elemento sólo existirá un vez, y el score será el de la última actualización.

La ordenación se lleva a cabo en el momento de añadir elementos al conjunto y no al solicitar los mismos, lo que hace que esta operación sea muy rápida. La ordenación se realiza por el score, y en caso de que el score sea el mismo, se resuelve por orden lexicográfico. Además es posible recuperar un rango de elementos, como los 10 primeros más buscados o los 10 últimos que han publicado, por ejemplo. El caso de uso habitual de los conjuntos ordenados es la implementación de leaderboards.

Otro caso de uso que quizás no sea tan conocido, es utilizar este tipo de dato como un índice para otras estructuras que tengamos almacenadas en Redis. Si por ejemplo tenemos un hash de usuarios con la información de los mismos, podremos recuperar la información de un usuario de manera muy rápida por la clave asociada al hash, pero no por cualquier otro atributo del usuario. Para remediar esto, podemos utilizar un set ordenado como índice secundario en el que mantengamos el atributo que queremos indexar. Se suele utilizar para generar índices invertidos para sistemas de búsqueda con autocompletado.

  • Hashes:  

Un hash permite asociar a una clave una colección de pares clave-valor, habitualmente usado para representar objetos.

Con un hash podemos almacenar cualquier entidad con sus atributos asociados (como una especie de tabla o diccionario), de forma que podamos recuperar únicamente el atributo de interés en cada momento. Además, Redis almacena los hashes de forma muy eficiente, lo que nos permitirá sacar el máximo partido a la memoria disponible.

redis lua header

En conclusión, Redis gestiona la información en memoria, lo que hace que sea muy rápido almacenando y recuperando datos, a la vez que permite persistir los datos en disco. Además se puede configurar la expiración automática de las claves, y tiene funcionalidades de publicación/suscripción (para crear canales), pipelines para ejecutar comandos en grupo y transacciones.

También permite capacidades de scripting en el servidor utilizando el lenguaje Lua, lo que supone poder crear nuevos comandos. No falta la capacidad de replicar datos, con failover automático y de particionado de los mismos.

Con todas estas capacidades, Redis es una base de datos clave-valor que nos ayudará a resolver más casos de negocio de los que hubiéramos imaginado.

 

 

 

Vicente Ayestarán

Recibe más artículos como este

Recibirás un email por cada nuevo artículo.. Acepto los términos legales

Escribe un comentario