Cache em TypeScript: Redis, Memcached e soluções integradas: de A a Z
\n\nCache é uma das ferramentas-chave para melhorar o desempenho de aplicações web e serviços. No ecossistema TypeScript e Node.js, os desenvolvedores podem escolher entre sistemas externos poderosos (Redis, Memcached) e soluções integradas leves. Neste artigo, abordaremos todas as três abordagens, forneceremos exemplos práticos de código em TypeScript e ajudaremos você a escolher a estratégia ideal para o seu projeto.
\n\nPor que usar cache em TypeScript?
\nO cache permite reduzir o tempo de resposta do servidor, diminuir a carga em bancos de dados e APIs externas, além de reduzir latências em requisições repetidas. Em TypeScript, executado sobre Node.js, o cache é especialmente útil para:
\n- \n
- armazenar resultados de cálculos pesados; \n
- armazenar em cache respostas de APIs externas; \n
- salvar sessões de usuários; \n
- reduzir o número de consultas ao banco de dados. \n
1. Soluções integradas para cache em TypeScript
\nPara projetos pequenos ou protótipos, você pode usar recursos nativos do Node.js sem instalar pacotes adicionais.
\n\n1.1. Usando Map
\nA maneira mais simples é usar um objeto Map ou um objeto simples. No entanto, esse cache vive apenas na memória de um único processo e é perdido ao reiniciar.
// Cache simples baseado em Map\nclass SimpleCache<T> {\n private cache = new Map<string, T>();\n\n get(key: string): T | undefined {\n return this.cache.get(key);\n }\n\n set(key: string, value: T): void {\n this.cache.set(key, value);\n }\n\n clear(): void {\n this.cache.clear();\n }\n}\n\n// Exemplo de uso\nconst cache = new SimpleCache<string>();\ncache.set('user:1', 'Alice');\nconsole.log(cache.get('user:1')); // Alice\n\n1.2. Cache com TTL (Time-To-Live)
\nUma versão mais avançada é o cache com remoção automática de entradas após um tempo determinado.
\n// Cache com TTL\nclass TtlCache<T> {\n private cache = new Map<string, { value: T; expiry: number }>();\n\n get(key: string): T | undefined {\n const item = this.cache.get(key);\n if (!item) return undefined;\n if (Date.now() > item.expiry) {\n this.cache.delete(key);\n return undefined;\n }\n return item.value;\n }\n\n set(key: string, value: T, ttlMs: number): void {\n this.cache.set(key, {\n value,\n expiry: Date.now() + ttlMs,\n });\n }\n}\n\n// Exemplo\nconst ttlCache = new TtlCache<number>();\nttlCache.set('price', 100, 5000); // vive por 5 segundos\nsetTimeout(() => console.log(ttlCache.get('price')), 6000); // undefined\n\n2. Cache com Redis em TypeScript
\nRedis é um popular armazenamento de dados in-memory que suporta estruturas de dados avançadas, pub/sub e persistência. Para TypeScript, utiliza-se o pacote ioredis.
2.1. Instalação e conexão
\nnpm install ioredis\nnpm install @types/ioredis --save-dev\nimport Redis from 'ioredis';\n\nconst redis = new Redis({\n host: 'localhost',\n port: 6379,\n});\n\nredis.on('connect', () => console.log('Conectado ao Redis'));\nredis.on('error', (err) => console.error('Erro no Redis', err));\n\n2.2. Operações básicas set/get
\n// Salva um valor\nawait redis.set('user:1:name', 'Alice');\n\n// Obtém um valor\nconst name = await redis.get('user:1:name');\nconsole.log(name); // Alice\n\n// Define TTL (em segundos)\nawait redis.setex('session:123', 3600, 'active');\n\n2.3. Trabalhando com objetos (JSON)
\n// Salva um objeto\nconst user = { id: 1, name: 'Alice', email: 'alice@example.com' };\nawait redis.set('user:1', JSON.stringify(user));\n\n// Lê e faz o parse\nconst r