Noções Básicas de Cache
8 exemplos para você começar com cache para APIs Node.js - 6 básicos e 2 intermediários.
Busque em todas as páginas da documentação
8 exemplos para você começar com cache para APIs Node.js - 6 básicos e 2 intermediários.
npm install ioredis
npm install -D typescript@5.6 tsx @types/nodeExecute o Redis localmente: docker run -d -p 6379:6379 redis:7. Veja ioredis para detalhes de conexão.
import Redis from "ioredis";
const redis = new Redis(process.env.REDIS_URL!);
export async function getProduct(sku: string, loadFromDb: (sku: string) => Promise<Product | null>) {
const key = `product:${sku}`;
const cached = await redis.get(key);
if (cached) return JSON.parse(cached) as Product;
const product = await loadFromDb(sku);
if (product) {
await redis.set(key, JSON.stringify(product), "EX", 300);
}
return product;
}EX 300) limita a obsolescênciaRelacionado: ioredis - configuração do cliente
| Tipo de dado | TTL Típico | Invalidação |
|---|---|---|
| Catálogo de produtos | 5-15 min | Na atualização do admin |
| Sessão do usuário | 24h deslizante | Logout exclui a chave |
| Flags de configuração | 30-60s | Pub/sub ou TTL curto |
| Contadores de limite de taxa | Janela de 1 min | Expiração automática |
export async function updateProduct(sku: string, data: Partial<Product>, save: () => Promise<Product>) {
const updated = await save();
await redis.del(`product:${sku}`);
return updated;
}const NS = `api:${process.env.APP_ENV}:v1`;
function productKey(sku: string) {
return `${NS}:product:${sku}`;
}v1 para v2 em caso de alterações que quebrem o formato do cacheexport async function getWithFallback<T>(
fetchCache: () => Promise<T | null>,
fetchOrigin: () => Promise<T>
): Promise<T> {
try {
const hit = await fetchCache();
if (hit !== null) return hit;
} catch (err) {
console.warn({ msg: "cache_unavailable", err: (err as Error).message });
}
return fetchOrigin();
}await redis.set(key, JSON.stringify(value), "EX", ttl);
const raw = await redis.get(key);
const value = raw ? (JSON.parse(raw) as T) : null;async function getOrLoad(key: string, ttlSec: number, loader: () => Promise<string>) {
const hit = await redis.get(key);
if (hit) return hit;
const lockKey = `${key}:lock`;
const acquired = await redis.set(lockKey, "1", "EX", 10, "NX");
if (!acquired) {
await new Promise((r) => setTimeout(r, 50));
return (await redis.get(key)) ?? loader();
}
try {
const value = await loader();
await redis.set(key, value, "EX", ttlSec);
return value;
} finally {
await redis.del(lockKey);
}
}get novamenteRelacionado: Locks Distribuídos - ressalvas sobre locks
| Padrão | Quem carrega em caso de miss? | Padrão Node |
|---|---|---|
| Cache-aside | Código da aplicação | Maioria dos handlers Express/Fastify |
| Read-through | Biblioteca de cache | Menos comum em Node |
| Write-through | Escrita síncrona para cache + DB | Custo de consistência mais alto |
Geralmente não. Faça cache de leituras GET com semântica de chave clara. Mutações invalidam.
Em memória por instância causa acertos inconsistentes entre réplicas. Use Redis para cache compartilhado.
70%+ em chaves quentes direcionadas é saudável. Baixa taxa significa chaves erradas ou TTL muito curto.
Sim, com TTL curto (30-60s) para proteger o DB de misses repetidos para chaves ausentes.
CDN/Cache-Control para leituras estáticas públicas. Redis para dados personalizados ou protegidos por autenticação.
allkeys-lru é comum em nós de cache dedicados. Monitore alertas de uso de memória.
Inclua tenantId no prefixo da chave. Nunca permita vazamento de cache entre tenants.
@nestjs/cache-manager envolve stores, incluindo Redis. As mesmas regras de TTL e invalidação se aplicam.
Versões do Stack: Esta página foi escrita para Node.js 24.18.0 (Active LTS), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 e NestJS 11.
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026