Caché en TypeScript: Redis y otras herramientas para Node.js
El caché es uno de los mecanismos clave para optimizar el rendimiento de aplicaciones web. En proyectos TypeScript con Node.js, el caché permite reducir el tiempo de respuesta de la API, disminuir la carga en las bases de datos y reducir los costos de llamadas externas. En este artículo, analizaremos las bibliotecas populares para caché, su configuración y ejemplos prácticos.
¿Por qué es necesario el caché?
Sin caché, cada solicitud al servidor puede provocar un procesamiento repetido de datos: lectura de la base de datos, cálculos complejos o llamadas a APIs externas. El caché guarda el resultado de la primera llamada y lo entrega en milisegundos en solicitudes posteriores. Escenarios principales:
- Caché de respuestas de servicios externos (clima, tipos de cambio);
- Almacenamiento de datos solicitados con frecuencia (directorios, configuraciones);
- Reducción del tiempo de renderizado de páginas;
- Limitación del número de solicitudes a la base de datos.
Bibliotecas populares para caché en TypeScript
1. Redis (a través de ioredis)
Redis es un almacén de datos en memoria que funciona como servidor. Para TypeScript, el mejor cliente es ioredis con soporte completo de tipos. Instalación:
npm install ioredisnpm install -D @types/ioredisEjemplo de caché básico con TTL (tiempo de vida):
import Redis from 'ioredis';
const redis = new Redis({ host: 'localhost', port: 6379,});
// Guardamos datos por 60 segundosawait redis.set('user:123', JSON.stringify({ name: 'Ana' }), 'EX', 60);
// Obtenemos datosconst cached = await redis.get('user:123');if (cached) { const user = JSON.parse(cached); console.log(user.name); // Ana}Ventajas: almacenamiento distribuido, eliminación automática de claves, soporte para estructuras complejas (listas, hashes). Desventajas: requiere un servidor Redis en ejecución, latencia por llamada de red.
2. node-cache (en memoria)
node-cache es una biblioteca simple para caché en memoria del proceso. No requiere dependencias externas. Instalación:
npm install node-cachenpm install -D @types/node-cacheEjemplo:
import NodeCache from 'node-cache';
const myCache = new NodeCache({ stdTTL: 120 }); // TTL por defecto 120 seg
// GuardamosmyCache.set('config', { theme: 'dark', lang: 'es' });
// Obtenemosconst config = myCache.get('config');if (config) { console.log(config.theme); // dark}
// EliminamosmyCache.del('config');Adecuado para aplicaciones pequeñas donde no se necesita sincronización entre servidores.
3. memory-cache
Otra biblioteca en memoria con una API minimalista. Se distingue por su simplicidad y ausencia de dependencias:
npm install memory-cacheEjemplo:
import cache from 'memory-cache';
cache.put('weather', { temp: 22, condition: 'sunny' }, 300_000); // 5 minutos
const weather = cache.get('weather');if (weather) { console.log(`Temperatura: ${weather.temp}°C`);}
// Verificar existencia de claveif (cache.keys().includes('weather')) { // ...}Estrategias de caché para TypeScript
La elección de la estrategia depende de la naturaleza de los datos:
- Write-through — los datos se escriben en el caché y la base de datos simultáneamente. Garantiza consistencia, pero aumenta el tiempo de escritura.
- Write-behind — la escritura en el caché es instantánea, en la base de datos es asíncrona. Rápido, pero posible pérdida de datos en caso de fallo.
- Cache-aside — la aplicación verifica el caché por sí misma; en caso de fallo, lee de la base de datos y llena el caché. Es el patrón más popular.
Implementación de Cache-aside en TypeScript con ioredis:
async function getUserById(id: number) { const cacheKey = `user:${id}`; const cached = await redis.get(cacheKey);
if