Redis como base de datos
Un artículo de Rafa G. Blanes
Desde hace mucho he usado Redis como una de mis utilidades favoritas para integrarla en mis proyectos. Para quien no lo conozca bien, Redis se ha considerado siempre un servicio de almacenamiento en memoria tipo clave/valor
Sin embargo, desde hace tiempo Redis es muchísmo más, soportando diversas estructuras de datos que lo enriquecen y que hace que se le pueda dar un uso mucho más amplio.
No es una aplicación que se utiliza únicamente como caché de métricas, sesiones de usuario, etc., sino que para determinadas aplicaciones cuya necesidad de almacenamiento de información no es necesariamente relacional, Redis se puede usar perfectamente como base de datos.
Existen servidores en memoria similares como Memcache. Sin embargo, en Picly.io (servidor avanzado de imágenes, proyecto en pleno desarrollo), hemos decidido usar como base de datos Redis; esto es una decisión importante de diseño y que, de algún modo, condicionará el despliegue y uso de ese servicio.
Lo que quiero recalcar es que perfectamente Redis puede sustituir en algunas ocasiones el uso de bases de datos como MySql, MongoDB, Sql Server, etc.
En este caso, estos son los argumentos que me han llevado a elegir Redis como repositorio de datos para Picly.io:
- El core de Picly debe ser pequeño pero muy robusto y eficiente.
- La necesidad de almacenamiento de información de Picly es relativamente sencilla: estructuras de datos planas y con relaciones muy simples.
- El rendimiento debe ser extraordinario para servir imágenes y su procesamiento y transformaciones lo más rápido posible.
- Redis es un producto de libre uso muy maduro, con mucha documentación y una comunidad muy amplia.
- La instalación es sencilla, como se puede ver en este artículo para un Ubuntu 16; su mantenimiento, también.
- Para grandes instancias de Picly (con millones de imágenes o requests de transformación de imágenes), Redis se puede escalar entre varios servidores y está soportado por diversos proveedores de servicios en cloud, como Azure Redis Cache
Y una cosa interesante: el rendimiento de Redis, el tiempo que va a tardar en devolver un objeto, es determinista, lo que no ocurre con una base de datos relacional salvo que se configure correctamente y usando muchos recursos.
Algunas de las estructuras de datos que soporta Redis son objetos clave/valor, hashes, listas, listas ordenadas con paginación, etc., lo suficiente para que una aplicación pueda apoyarse en este producto sin necesidad de usar un servidor de base de datos más pesado. Además, una incorporación desde versiones anteriores es la capacidad de utilizar scripts con Lua, permitiendo realizar consultas y procesos de cálculo más complejas.
Ahora bien, el uso directo de Redis mediante sus comandos básicos (como HADD, ZRANGE, etc.), puede enmarañar u ofuscar una aplicación de alto nivel que lo utilice.
Para ello, y puesto que Picly.io se está desarrollando con Node JS, estoy desarrollando una pequeña librería para encapsular cómodamente el uso de Redis por parte de una aplicación.
La he denominado Blue Entities y está disponible en Github; aunque se usa en Picly, todavía no me atrevería a decir que está lista para producción y tenemos pendiente incorporar bastantes mejoras en los próximos meses.
Por poner un ejemplo, con esta módulo de Node, y a partir de un esquema como:
var schema = {
name: "users",
properties: [
{ name: "mail", type: "string" },
{ name: "password", type: "string" },
{ name: "active", type: "boolean" },
{ name: "age", type: "integer" }
]
}
, se pueden añadir entidades de esta forma:
var redisConfig = { host: "localhost", port: 6379 };
var blueEntities = require("blueentities")(schema, redisConfig );
var newUser = {
mail: "info@solidstack.es",
password: "123454321",
active: true,
age: 43
}
blueEntities.addEntity( "users", newUser )
.then( function(id) {
// User added!!!
});
Y su recuperación de la base de datos es trivial (y a alto nivel, que es lo interesante):
blueEntities.getEntity( "users", id )
.then( function(user) {
// User retrieved!!!
});
Internamente, las entidades son convertidas a objetos de Redis pero de forma transparente y eficiente para el cliente de Blue Entities.
Existen otros proyectos muchos más completos y a modo de ORM para Redis y NodeJS, pero me parecieron demasiado pesados para las necesidades de almacenamiento de Picly.io.
En cualquier caso, sugiero encarecidamente evaluar bien cómo encaja Redis en los proyectos que desarrollamos y considerarlo como una utilidad importante a tener en cuenta.