Node.JS and Cache with REDIS
Gabriel Valin
Posted on October 28, 2022
Primeiramente, o quê é cache?
Segundo a querida Wikipedia, cache é:
Na área da computação, cache é um dispositivo de acesso rápido, interno a um sistema, que serve de intermediário entre um operador de um processo e o dispositivo de armazenamento ao qual esse operador acede.
Aqui nesse artigo iremos utilizar um simples servidor HTTP feito com Expressjs e duas rotas GET para mostrar uma das dezenas de estratégias existentes para se lidar com cache.
Clone o repositório para visualizar a estrutura por dentro e também contém a descrição para rodar o projeto: https://github.com/Gabriel-Valin/api-cache-redis
Contexto ficticío:
Uma empresa tem 5 mil funcionários, todos cadastrados em um banco de dados; Precisamos disponibilizar um endpoint para que esses usuários possam ser consultados.
Execução:
Começamos pensando que o processo de transferência de pacotes entre redes está entre uma das tarefas mais demoradas que um computador pode fazer, apesar de que para um humano isso seja "alienigenamente" rápido. Então como podemos otimizar a entrega desse pacotão com 5 mil funcionários? Resposta? CACHE!!
cache.ts: Configuração da conexão com Redis.
import IORedis from 'ioredis';
const redis = new IORedis({
host: process.env.REDIS_HOST,
port: 6379,
password: process.env.REDIS_PASS
})
export default redis
list-service: Listando usuários.
import { getAllUsers } from "../repositories/find-all"
import redis from "./cache"
export const CACHE_KEY = 'users'
export const listAllUsersService = async () => {
const cachedUsers = await redis.get(CACHE_KEY)
if (cachedUsers) {
return JSON.parse(cachedUsers)
}
const users = getAllUsers()
await redis.set(CACHE_KEY, JSON.stringify(users))
return users
}
add-user: Adicionando novo usuário a empresa.
import redis from "../services/cache";
import { CACHE_KEY } from "../services/list-service";
import { Response, Request } from "express";
export const addNewUser = async (req: Request, res: Response) => {
// here will create a new user
// when user created we should cleanup cache 'cause the user list was updated
await redis.del(CACHE_KEY)
return res.status(200).json({ message: 'cache clean' })
}
Estratégia:
Temos uma lista bem grande para disponibilizar ao client, então utilizamos a simples estratégia de após a primeira consulta no endpoint o conteúdo irá ficar "cached" e só invalidamos o cache assim que um novo usuário for cadastrado na empresa e assim o ciclo se repetirá. Com isso, a lista ficará sempre em cache, podendo reduzir o tempo de resposta em até mais de 50%.
Bônus:
Lembrando que existem vários sistemas de armazenamento em cache, esse foi apenas uma demonstração simples que acontece no mundo real onde precisamos "cachar" a entrega de conteúdo em um API, para mais informações, leia este artigo do Ed Rodrigues.
https://edrodrigues.com.br/blog/estrategias-de-cache-tudo-o-que-voce-precisa-saber/
Posted on October 28, 2022
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.