Cache em JavaScript: Redis, Memcached e soluções integradas: de A a Z
\n\nCache é uma das ferramentas essenciais para melhorar o desempenho de aplicações web. No contexto de JavaScript e Node.js, um cache bem implementado permite reduzir a carga no banco de dados, diminuir o tempo de resposta da API e melhorar a experiência do usuário. Neste artigo, abordaremos três abordagens principais: cache integrado na memória do processo, Memcached e Redis. Você aprenderá quando escolher cada ferramenta e obterá exemplos de código prontos.
\n\nPor que usar cache em Node.js?
\nNode.js é um ambiente single-thread com E/S assíncrona. Cada requisição ao banco de dados ou API externa consome tempo. O cache permite armazenar dados frequentemente solicitados em um armazenamento rápido (memória RAM) e entregá-los sem operações pesadas repetidas. Isso é especialmente importante para:
\n- \n
- Reduzir a latência em requisições repetidas \n
- Diminuir a carga em bancos de dados (PostgreSQL, MongoDB, etc.) \n
- Economizar recursos computacionais do servidor \n
- Aumentar a capacidade de processamento da aplicação \n
Cache integrado em Node.js (In-Memory Cache)
\nA maneira mais simples é usar um objeto Map ou Object no escopo global. Isso é adequado para projetos pequenos ou dados que vivem dentro de um único processo.
Exemplo: Cache simples com 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); // remove dados expirados\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\nVantagens: simplicidade, latência de rede zero, não requer instalação de serviços adicionais.
\nDesvantagens: dados não são compartilhados entre múltiplos processos/servidores, limitados pela memória de um único processo.
Memcached: cache distribuído
\nMemcached é um sistema de cache distribuído de alto desempenho em memória. É simples, rápido e adequado para armazenar pequenos volumes de dados (por exemplo, sessões ou fragmentos HTML). Para Node.js, existe o módulo popular memcached.
Instalação e conexão
\nnpm install memcached\n\nExemplo de uso com Memcached
\nconst Memcached = require('memcached');\nconst memcached = new Memcached('localhost:11211');\n\n// Gravar dados com TTL (em segundos)\nmemcached.set('user:456', { name: 'Bob' }, 3600, (err) => {\n if (err) console.error('Erro ao gravar:', err);\n});\n\n// Ler dados\nmemcached.get('user:456', (err, data) => {\n if (err) {\n console.error('Erro ao ler:', err);\n } else if (data) {\n console.log('Dados do cache:', data);\n } else {\n console.log('Cache vazio — dados não encontrados');\n }\n});\n\n// Fechar conexão ao encerrar\nprocess.on('SIGINT', () => {\n memcached.end();\n});\n\nVantagens: API simples, alta velocidade, distribuição entre servidores.
\nDesvantagens: sem replicação integrada, dados perdidos ao reiniciar, conjunto limitado de tipos de dados.
Redis: cache poderoso com recursos avançados
\nRedis não é apenas um cache, mas um armazenamento de dados completo em memória com suporte a estruturas complexas (strings, listas, conjuntos, hashes). Ele oferece persistência, replicação e transações. Para Node.js, usamos a biblioteca redis.
Instalação
\nnpm install redis\n\n