Almacenamiento en caché en TypeScript: Redis, Memcached y soluciones integradas
Las aplicaciones web modernas en TypeScript requieren alta velocidad de respuesta y una gestión eficiente de los recursos. Una de las herramientas clave para lograr este objetivo es el almacenamiento en caché. En este artículo, analizaremos en detalle tres enfoques principales para el almacenamiento en caché en el ecosistema TypeScript/Node.js: el uso de Redis, Memcached y soluciones integradas (caché en memoria). Aprenderá cómo elegir la herramienta adecuada para su tarea y verá ejemplos de código funcionales.
¿Por qué es necesario el almacenamiento en caché en TypeScript?
El almacenamiento en caché permite almacenar temporalmente datos solicitados con frecuencia en un almacenamiento rápido para reducir el tiempo de respuesta y disminuir la carga en las bases de datos o API externas. En TypeScript, que se ejecuta en Node.js, el almacenamiento en caché es especialmente útil para:
- Acelerar consultas repetitivas a la base de datos;
- Reducir las latencias al acceder a servicios externos;
- Optimizar operaciones computacionalmente complejas;
- Gestionar sesiones de usuarios.
Consideremos los tres tipos principales de almacenamiento en caché disponibles para el desarrollador en TypeScript.
1. Caché integrado (In-Memory Cache)
La forma más simple y rápida es almacenar datos en la memoria del propio proceso de Node.js. Para esto, se puede usar Map o bibliotecas más avanzadas, como node-cache.
Ventajas:
- Velocidad máxima (sin llamadas de red);
- Simplicidad de implementación;
- No requiere instalación de servicios externos.
Desventajas:
- Los datos se pierden al reiniciar la aplicación;
- Limitado por la cantidad de RAM de un solo proceso;
- No funciona en modo clúster (cada proceso tiene su propio caché).
Ejemplo usando node-cache
Instale la biblioteca:
npm install node-cacheImplementación de un servicio de caché simple:
import NodeCache from 'node-cache';
class MemoryCacheService { private cache: NodeCache;
constructor(ttlSeconds: number = 600) { this.cache = new NodeCache({ stdTTL: ttlSeconds, checkperiod: 120 }); }
public get<T>(key: string): T | undefined { return this.cache.get<T>(key); }
public set<T>(key: string, value: T, ttl?: number): boolean { return this.cache.set(key, value, ttl); }
public has(key: string): boolean { return this.cache.has(key); }
public del(key: string): number { return this.cache.del(key); }
public flush(): void { this.cache.flushAll(); }}
// Usoconst cacheService = new MemoryCacheService(300); // TTL = 5 minutos
async function getData(id: string): Promise<any> { const cached = cacheService.get<any>(`data:${id}`); if (cached) { return cached; }
// Simulación de una operación costosa const data = await fetchFromDatabase(id); cacheService.set(`data:${id}`, data); return data;}2. Almacenamiento en caché con Redis
Redis es un potente almacén de datos en memoria que se utiliza a menudo como caché. Admite estructuras de datos complejas (cadenas, hashes, listas, conjuntos) y puede funcionar en modo clúster.
Ventajas:
- Persistencia (opcional);
- Soporte para estructuras de datos complejas (por ejemplo, conjuntos ordenados);
- Mecanismos TTL (Time-To-Live) integrados;
- Excelente rendimiento (hasta 100 000 operaciones/segundo);
- Soporte para Pub/Sub para intercambio de mensajes.
Desventajas:
- Requiere instalación y configuración de un servidor separado;
- Utiliza más memoria que las soluciones integradas;
- Latencias de red (aunque mínimas).