¿Cómo conectar un micro servicio con un servidor Redis?
Conectar un micro servicio a un servidor Redis puede ser un desafío emocionante, especialmente para los desarrolladores que desean aprovechar al máximo las capacidades de almacenamiento en memoria que ofrece Redis. Para lograrlo, necesitas seguir estos pasos esenciales y entender las configuraciones básicas. A continuación, te guiamos en el proceso utilizando librerías y herramientas con las que trabajarás para establecer esta conexión.
¿Qué necesitas para iniciar con Redis?
Instalación de un servidor Redis: Puedes instalar Redis localmente o utilizar un servicio en línea que ofrezca pruebas gratuitas de Redis. Muchas plataformas populares pueden proporcionarte la posibilidad de trabajar con bases de datos de Redis online, brindando información básica como la dirección, el puerto y las credenciales de acceso.
Información relevante de la base de datos: Debes obtener los detalles específicos de la base de datos, como el host o la dirección, el puerto y la contraseña. Esta información será clave para la configuración del cliente que se conectará a Redis desde tu aplicación.
¿Cómo instalar la librería de Redis en tu aplicación?
Usamos npm en esta guía, pero si trabajas con otro gestor de paquetes, asegúrate de adaptar los comandos:
npminstall redis
Esto instalará la librería necesaria para interactuar con Redis desde tu aplicación.
¿Cómo configurar la conexión a Redis?
Una vez instalada la librería, se crea un cliente de conexión. Aquí te mostramos cómo definir las configuraciones básicas:
¿Cómo estructurar la configuración de manera segura?
Es fundamental que guardes las configuraciones, especialmente credenciales, en un archivo separado o una variable de entorno para evitar exposición innecesaria en el código:
// Archivo de configuración (config.js)module.exports={redisHost:'tu_direccion_redis',redisPort:'tu_puerto_redis',redisPassword:'tu_contraseña_redis'};// Uso en tu aplicaciónconst{ redisHost, redisPort, redisPassword }=require('./config');const client = redis.createClient({host: redisHost,port: redisPort,password: redisPassword });
¿Cómo implementar las funciones clave para acceder a Redis?
Por último, puedes crear funciones que lidien con diferentes operaciones en Redis. Aquí te damos un ejemplo para listar y añadir entradas, manejando estados de caché:
// Función para listar datosfunctionlistarDatos(entidad, tabla, callback){ client.get(tabla,(err, data)=>{if(err)returncallback(err);if(data){callback(null,JSON.parse(data));}else{callback(null,[]);}});}// Función para añadir datosfunctionaddData(tabla, data){const key =`${tabla}_${data.id}`; client.set(key,JSON.stringify(data),'EX',10,(err)=>{if(err)throw err;});}
Con estas configuraciones básicas y funciones, tu aplicación estará lista para interactuar de manera efectiva con un servidor Redis, almacenando y recuperando datos de forma eficiente y segura. Asegúrate de manejar adecuadamente los errores y ajustar los tiempos de expiración de cache según sea necesario para tu aplicación. ¡Sigue explorando y experimentando con Redis en tus proyectos!
Conexión de Microservicios a Redis y Gestión de Caché
No recuerdo otro curso en que se hayan visto tantos temas en el desarrollo del proyecto y tan bien explicados.
Muy curiosos como se tomaron la molestia de editar el video para cubrir la contraseña y otros datos de acceso y luego los dejan expuestos en el código XD
Si la verdad es que es gracioso😄
Y aun después de años sigue ahí jajaj
Para los que estamos viendo este curso en 2022, les dejo la forma en la que el codigo me funciono, al parecer redis ha cambiado mucho desde que se realizo este video
NOTA: tuve que crear un usuario y un rol en el portal de redis porque no supe como fabricar el url con el usuario por defecto
const client = redis.createClient({// host: config.cacheService.dbHost,// port: config.cacheService.dbPort,// password: config.cacheService.dbPassurl:`redis://${config.cacheService.dbUser}:${config.cacheService.dbPass}@${config.cacheService.dbHost}:${config.cacheService.dbPort}`});(async()=>{await client.connect();console.log('Conectado a REDIS');})();exportdefault{asynclist(table){const value =await client.get(table);returnJSON.parse(value);},asyncget(table, id){const value =await client.get(`${table}_${id}`);returnJSON.parse(value);},asyncupsert(table, data){let key = table;if(data && data.id){ key +='_'+ data.id;}await client.set(key,JSON.stringify(data));returntrue;}};
Excelente muchas gracias Leonardo.
Nota: el usuario por defecto es default
Lo que vamos hacer es traer data de mysql, guardarla en redis. Pero cada vez que mi API solicite data, primero revisa en redis, si está allí la trae, si no entonces va y la trae de mysql. Estoy bien?
A alguien más le esta saliendo este error a la hora de generar el redis client?
Ready check failed:NOAUTHAuthentication required
A mi, pudiste resolverlo?
Solucionado! Había problemas con las credenciales.
Para que se hace cache a la funcion upsert?
Se hace para actualizar la Caché cada vez que se actualiza la base de datos debido a una operación CRUD. (excepto para la operación Read)
¿Si dice que al leer de la base de datos pasamos los strings a objetos por qué no usamos JSON.parse() en lugar de JSON.stringify()?
Mas adelante se da cuenta que no esta parsiando bien y lo cambia.
Para los que estamos viendo este curso en 2025, la librería ha sufrido muchos cambios, yo lo implemente de la siguiente forma y me funciono muy bien
const config =require('../config.js')const{ createClient }=require('redis')constinitRedis=async()=>{try{const client =createClient({url:`redis://${config.services.cache.url}`,password:`${config.services.cache.password}`}) client.on('connect',()=>{console.log('Conectado a Redis')})await client.connect()}catch(error){throwError(`Intento de conexion a base de datos - ${error.message}`)}}initRedis()constlist=async(table)=>{returnnewPromise((res, rej)=>{ client.get(table).then(data=>res(JSON.parse(data))).catch(err=>rej(err))})}constget=(table, id)=>{returnnewPromise((res, rej)=>{ client.get(table).then(data=>{if(data){const parseData =JSON.parse(data)const foundItem = parseData.find(item=> item.id=== id)res(foundItem ? foundItem :null)}else{res(null)}}).catch(err=>rej(err))})}constupsert=async(table, data)=>{returnnewPromise((res,rej)=>{ client.get(table).then(result=>{let parseData =[]if(result){ parseData =JSON.parse(result)} parseData.push(data)const key =`${table}`const stringifyData =JSON.stringify(parseData) client.set(key, stringifyData).then(rta=>{res()}).catch(err=>{rej(err)})}).catch(err=>rej(err))})}module.exports={ list, get, upsert,}
la gran incertidumbre que siempre tuve es: que pasa si tengo una base de 20 millones de clientes.. todos los 20 millones tengo que traerlos al redis?? la memoria tendra suficiente espacio para almacenar tanta data?
Debes ver si esto que comentas realmente lo aplicarias en un proyecto y cual es el fin ? , cuando se hace uso de la cache , no debe ser en todas las operaciones , solo en la que tu veas necesario y factible, en este caso no veo que sea buena idea.
En el metodo list, en caso de existir data, no deberia ser JSON.parse(data) en lugar de de stringify?, es decir, si lo que esta almacenado es una cadena de texto, no deberiamos convertir esa cadena a json al retornarlo?
Dado que Redis guarda en string y en el get toca recibir información en String, es correcto parsear esta información para obtenerla como objeto, tal vez se le fue al profesor.
Hola a todos, me gustaría saber si alguien sabe de que año es este curso, pienso que Platzi debería tener algún a párrado en la descripción del curso donde esté este dato.
El repo es de finales de 2019, así que esa debe ser la fecha de grabación.