Profundizando en la Optimización de Node.js con las Bases de Datos Internas de Redis
Es bastante claro que en el ámbito de las bases de datos en memoria, Redis se destaca por su velocidad y eficiencia en el almacenamiento y recuperación de datos, eso no se discute, pero me temo que no están utilizando Redis correctamente y en este artículo, trataré de explicar como usarlo correctamente, específicamente me refiero a sus bases de datos internas, qué son y como podrían ayudarte a la gestión de datos.
Bases de datos internas, de qué hablas?
Las bases de datos internas de Redis son una característica distintiva que permite segmentar y organizar los datos dentro de la misma instancia de Redis. Imagina que Redis es una caja con compartimentos, y cada compartimento es una base de datos interna. Cada base de datos interna tiene un número asignado, que va desde 0 hasta 15, cada base de datos interna en Redis puede almacenar datos de manera independiente, y se pueden acceder y gestionar de forma individual. Esto es beneficioso porque te permite separar diferentes tipos de datos y utilizarlos para propósitos específicos, como el almacenamiento en caché, la gestión de datos temporales o el almacenamiento de datos estructurados.
De acuerdo a mi experiencia, comunmente se deben de utilizar las DBs en redis de la siguiente manera:
Base de Datos de Caché (DB 0)
La base de datos 0 es ideal para almacenar datos de caché que necesitas acceder rápidamente. Imagina que tienes una aplicación web donde muestras el mismo contenido a múltiples usuarios. En lugar de hacer una consulta costosa a la base de datos cada vez, puedes almacenar temporalmente ese contenido en la base de datos 0 de Redis y acceder a él de forma rápida, yo generalmente configuro mis accesos a bases de datos con una caché en redis y suelo preguntar primero si la data que necesito existe en redis antes de ir hasta la BD, un ejemplo sencillo sería el siguiente:
const redis = require('redis');
const client = redis.createClient();
const key = `user_details_${user_id}`; // imagina que user_id = 1
// almacenando datos
client.select(0, () => {
client.set(key, JSON.stringify({"id":1,"first_name":"Tessie","last_name":"Pearsey","email":"[email protected]"}));
});
// recuperando datos
client.select(0, () => {
client.get(key, (error, resultado) => {
if (error) throw error;
console.log(JSON.parse(resultado));
});
});
Bases de Datos de Almacenamiento (DB 1-15)
Estas bases de datos son perfectas para almacenar datos persistentes, como listas de tareas o preferencias de usuario. Imagina una aplicación de gestión de tareas donde los usuarios pueden agregar y completar tareas.
const redis = require('redis');
const client = redis.createClient();
const key = `user_details_${user_id}`; // imagina que user_id = 1
// almacenando tareas
client.select(1, () => {
client.rpush(key, JSON.stringify({"id":1,"name":"a feugiat et eros vestibulum","description":"PO Box 14007"}));
});
// recuperando tareas
client.select(1, () => {
client.lrange(key, 0, -1, (error, tarea) => {
if (error) throw error;
console.log(JSON.parse(tarea));
});
});
Base de Datos de Tiempo de Vida (DB 16)
La base de datos 16 es ideal para almacenar datos temporales que deben expirar después de un período. Supongamos que deseas almacenar tokens de autenticación con un tiempo de vida limitado.
const redis = require('redis');
const client = redis.createClient();
const key = `user_token_${user_id}`; // imagina que user_id = 1
// Almacenar un token en la base de datos 16 con expiración de 1 hora
client.select(16, () => {
client.setex(key, 3600, 'a6411eb3-135f-4027-8f65-0c9b6d58e11a');
});
// Recuperar el token (si aún no ha caducado)
client.select(16, () => {
client.get(key, (error, token) => {
if (error) throw error;
if (token) {
console.log('Token válido:', token);
} else {
console.log('El token ha caducado.');
}
});
});
Debo dejar claro que esta es simplemente una convención sugerida, ya que actualmente no hay nada en Redis que determine que debes usar la base de datos 0 para caché y las demás para almacenamiento. De hecho, muchas instalaciones de Redis simplemente usan una base de datos (por lo general, DB 0) para todos sus datos, ya sean de caché o persistentes.
Hice incapié en caché y persistencia porque aunque parecen similares, son cosas muy diferentes que se refieren a la retención de datos, tienen objetivos y características distintas, trataré de explicar a continuación:
-
Propósito:
- Caché: Su objetivo principal es mejorar la velocidad y eficiencia de recuperación de datos que son accedidos frecuentemente. Al almacenar temporalmente datos que son costosos de obtener (por ejemplo, resultados de una consulta compleja a una base de datos), se pueden evitar cálculos repetitivos y operaciones costosas en el futuro.
- Persistencia: Su objetivo es garantizar que los datos se almacenen de manera segura y duradera, independientemente de si son accedidos con frecuencia o no. Se utiliza para asegurarse de que no se pierda información crucial, incluso después de reinicios del sistema o fallas.
-
Durabilidad:
- Caché: Los datos en caché suelen ser volátiles. Si se apaga el sistema o se reinicia, es posible que los datos en caché se pierdan.
- Persistencia: Se refiere a datos que están diseñados para durar a largo plazo. Estos datos no deberían perderse a menos que se eliminen explícitamente.
-
Redundancia:
- Caché: Los datos en caché suelen ser redundantes en el sentido de que existe una copia principal de los datos en otro lugar (por ejemplo, una base de datos relacional). Si los datos en caché se pierden o se invalidan, se pueden regenerar a partir de la fuente original.
- Persistencia: Suele referirse a la única y principal copia de los datos. Si se pierden, no se pueden recuperar a menos que exista una copia de seguridad.
-
Vida útil:
- Caché: Los datos en caché suelen tener una vida útil limitada. Pueden tener una fecha de caducidad o pueden ser eliminados para hacer espacio a nuevos datos.
- Persistencia: Los datos persistentes se conservan hasta que se decida eliminarlos.
-
Costo:
- Caché: Dado que el caché suele ser más rápido, a menudo se implementa utilizando tecnologías más caras, como la memoria RAM.
- Persistencia: Los sistemas de almacenamiento persistente, como discos duros o sistemas de almacenamiento en red, son generalmente más lentos pero ofrecen más capacidad por un menor costo.
Aunque ambas estrategias se refieren al almacenamiento de datos, la caché se centra en la velocidad y eficiencia temporal, mientras que la persistencia se centra en la durabilidad y permanencia a largo plazo. Es por eso que en sistemas bien diseñados, a menudo se utilizan en conjunto: los datos se almacenan persistentemente en discos, pero se cachéan en memoria para un acceso rápido.
Ahora ya lo sabes, las diferentes bases de datos internas de Redis te permiten organizar y gestionar tus datos de manera específica según su naturaleza y requisitos de tiempo, no todo deberia estar almacenado en db0, esto mejorara en gran medida el rendimiento y la eficiencia de tu aplicación al permitirte acceder rápidamente a datos comunes, organizar datos estructurados y gestionar datos temporales de manera efectiva.
Happy coding! :D
Photo by Rick Mason on Unsplash