← Volver

Redis como base de datos

Por qué Redis puede ser una base de datos adecuada para Picly.io: estructuras de datos simples, rendimiento, facilidad de operación y una librería Node.js para abstraer sus comandos.

RedisPicly.ioBase de Datos

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 de tipo clave/valor.

Sin embargo, desde hace tiempo Redis es muchísimo más: soporta diversas estructuras de datos que lo enriquecen y permiten darle un uso mucho más amplio.

No es una aplicación que se utilice únicamente como caché de métricas, sesiones de usuario, etc. 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 Memcached. Sin embargo, en Picly.io —un servidor avanzado de imágenes que está en pleno desarrollo— hemos decidido usar Redis como base de datos. Es una decisión importante de diseño que, de algún modo, condicionará el despliegue y el uso de ese servicio.

Lo que quiero recalcar es que Redis puede sustituir perfectamente, 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 procesarlas y transformarlas 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 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 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, algo que no ocurre con una base de datos relacional salvo que se configure correctamente y se utilicen muchos recursos.

Algunas de las estructuras de datos que soporta Redis son objetos clave/valor, hashes, listas y listas ordenadas con paginación; 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, que permite realizar consultas y procesos de cálculo más complejos.

Ahora bien, el uso directo de Redis mediante sus comandos básicos (como HSET, ZRANGE, etc.) puede enmarañar u ofuscar una aplicación de alto nivel que lo utilice.

Por eso, 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.

Blue Entities

Por poner un ejemplo, con este módulo de Node.js y a partir de un esquema como este:

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 de alto nivel, que es lo interesante):

blueEntities.getEntity("users", id)
  .then(function(user) {
    // User retrieved!!!
  });

Internamente, las entidades se convierten en objetos de Redis, pero de forma transparente y eficiente para el cliente de Blue Entities.

Existen otros proyectos mucho más completos, a modo de ORM para Redis y Node.js, 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 que hay que tener en cuenta.