Caching en JavaScript: Redis, Memcached y soluciones integradas: de la A a la Z
\n\nEl caching es una de las herramientas clave para mejorar el rendimiento de las aplicaciones web. En el contexto de JavaScript y Node.js, un caching adecuado permite reducir la carga en las bases de datos, disminuir el tiempo de respuesta de las API y mejorar la experiencia del usuario. En este artículo, analizaremos tres enfoques principales: caching integrado en la memoria del proceso, Memcached y Redis. Aprenderá cuándo elegir cada herramienta y obtendrá ejemplos de código listos para usar.
\n\n¿Por qué es necesario el caching en Node.js?
\nNode.js es un entorno de un solo hilo con E/S asíncrona. Cada solicitud a una base de datos o API externa requiere tiempo. El caching permite almacenar datos solicitados con frecuencia en un almacenamiento rápido (memoria RAM) y entregarlos sin repetir operaciones pesadas. Esto es especialmente importante para:
\n- \n
- Reducir la latencia en solicitudes repetidas \n
- Disminuir la carga en las bases de datos (PostgreSQL, MongoDB, etc.) \n
- Ahorrar recursos computacionales del servidor \n
- Aumentar el rendimiento de la aplicación \n
Caching integrado en Node.js (In-Memory Cache)
\nLa forma más sencilla es usar un objeto Map o Object en el ámbito global. Esto es adecuado para proyectos pequeños o datos que viven dentro de un solo proceso.
Ejemplo: Caché simple con Map
\nconst cache = new Map();\n\nfunction getCachedData(key) {\n if (cache.has(key)) {\n const entry = cache.get(key);\n if (Date.now() < entry.expiry) {\n return entry.data;\n } else {\n cache.delete(key); // eliminar datos caducados\n }\n }\n return null;\n}\n\nfunction setCachedData(key, data, ttlMs = 60000) {\n cache.set(key, {\n data,\n expiry: Date.now() + ttlMs\n });\n}\n\n// Uso:\nsetCachedData('user:123', { name: 'Alice' }, 30000);\nconst user = getCachedData('user:123');\nconsole.log(user); // { name: 'Alice' }\n\nVentajas: simplicidad, latencia de red cero, no requiere instalar servicios adicionales.
\nDesventajas: los datos no se comparten entre múltiples procesos/servidores, limitados por la memoria de un solo proceso.
Memcached: caching distribuido
\nMemcached es un sistema de caching distribuido en memoria de alto rendimiento. Es simple, rápido y adecuado para almacenar pequeños volúmenes de datos (por ejemplo, sesiones o fragmentos HTML). Para Node.js existe el módulo popular memcached.
Instalación y conexión
\nnpm install memcached\n\nEjemplo de trabajo con Memcached
\nconst Memcached = require('memcached');\nconst memcached = new Memcached('localhost:11211');\n\n// Escritura de datos con TTL (en segundos)\nmemcached.set('user:456', { name: 'Bob' }, 3600, (err) => {\n if (err) console.error('Error de escritura:', err);\n});\n\n// Lectura de datos\nmemcached.get('user:456', (err, data) => {\n if (err) {\n console.error('Error de lectura:', err);\n } else if (data) {\n console.log('Datos del caché:', data);\n } else {\n console.log('Caché vacío — datos no encontrados');\n }\n});\n\n// Cerrar conexión al finalizar\nprocess.on('SIGINT', () => {\n memcached.end();\n});\n\nVentajas: API simple, alta velocidad, distribución entre servidores.
\nDesventajas: no tiene replicación integrada, los datos se pierden al reiniciar, conjunto limitado de tipos de datos.
Redis: caching potente con capacidades avanzadas
\nRedis no es solo un caché, sino un almacén de datos en memoria completo con soporte para estructuras complejas (cadenas, listas, conjuntos, hashes). Admite persistencia, replicación y transacciones. Para Node.js usamos la biblioteca redis.
Instalación
\nnpm install redis\n\n