Cache em TypeScript: Redis e outras ferramentas para Node.js
Cache é um dos principais mecanismos para otimizar o desempenho de aplicações web. Em projetos TypeScript com Node.js, o cache permite reduzir o tempo de resposta da API, diminuir a carga no banco de dados e reduzir custos com chamadas externas. Neste artigo, abordaremos bibliotecas populares de cache, sua configuração e exemplos práticos.
Por que usar cache?
Sem cache, cada requisição ao servidor pode resultar em processamento repetido de dados: leitura do banco de dados, cálculos complexos ou acesso a APIs externas. O cache armazena o resultado da primeira chamada e o retorna em milissegundos para requisições subsequentes. Cenários principais:
- Cache de respostas de serviços externos (clima, taxas de câmbio);
- Armazenamento de dados frequentemente solicitados (catálogos, configurações);
- Redução do tempo de renderização de páginas;
- Limitação do número de requisições ao banco de dados.
Bibliotecas populares de cache em TypeScript
1. Redis (via ioredis)
Redis é um armazenamento de dados in-memory que funciona como servidor. Para TypeScript, o melhor cliente é ioredis com suporte completo a tipos. Instalação:
npm install ioredisnpm install -D @types/ioredisExemplo de cache básico com TTL (tempo de vida):
import Redis from 'ioredis';
const redis = new Redis({ host: 'localhost', port: 6379,});
// Salva dados por 60 segundosawait redis.set('user:123', JSON.stringify({ name: 'Ana' }), 'EX', 60);
// Obtém dadosconst cached = await redis.get('user:123');if (cached) { const user = JSON.parse(cached); console.log(user.name); // Ana}Vantagens: armazenamento distribuído, remoção automática de chaves, suporte a estruturas complexas (listas, hashes). Desvantagens: requer servidor Redis em execução, latência de chamada de rede.
2. node-cache (in-memory)
node-cache é uma biblioteca simples para cache na memória do processo. Não requer dependências externas. Instalação:
npm install node-cachenpm install -D @types/node-cacheExemplo:
import NodeCache from 'node-cache';
const myCache = new NodeCache({ stdTTL: 120 }); // TTL padrão de 120 seg
// SalvamyCache.set('config', { theme: 'dark', lang: 'pt' });
// Obtémconst config = myCache.get('config');if (config) { console.log(config.theme); // dark}
// RemovemyCache.del('config');Adequado para aplicações pequenas onde não é necessária sincronização entre servidores.
3. memory-cache
Outra biblioteca in-memory com API minimalista. Destaca-se pela simplicidade e ausência de dependências:
npm install memory-cacheExemplo:
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`);}
// Verifica existência da chaveif (cache.keys().includes('weather')) { // ...}Estratégias de cache para TypeScript
A escolha da estratégia depende da natureza dos dados:
- Write-through — os dados são gravados no cache e no banco de dados simultaneamente. Garante consistência, mas aumenta o tempo de gravação.
- Write-behind — gravação no cache é instantânea, no banco de dados é assíncrona. Rápido, mas pode haver perda de dados em caso de falha.
- Cache-aside — a aplicação verifica o cache; em caso de falta, lê do banco de dados e preenche o cache. É o padrão mais popular.
Implementação de Cache-aside em TypeScript com ioredis:
async function getUserById(id: number) { const cacheKey = `user:${id}`; const cached = await redis.get(cacheKey);
if Também na biblioteca
Trabalhando com YAML em C++: biblioteca yaml-cpp para parsing e serialização