DEV Community

Cover image for Node.JS and Cache with REDIS
Gabriel Valin
Gabriel Valin

Posted on

Node.JS and Cache with REDIS

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
Enter fullscreen mode Exit fullscreen mode

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
}
Enter fullscreen mode Exit fullscreen mode

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' })
}
Enter fullscreen mode Exit fullscreen mode

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/

Top comments (0)