DEV Community

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

Posted on

3

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/

AWS GenAI LIVE image

How is generative AI increasing efficiency?

Join AWS GenAI LIVE! to find out how gen AI is reshaping productivity, streamlining processes, and driving innovation.

Learn more

Top comments (0)

nextjs tutorial video

Youtube Tutorial Series 📺

So you built a Next.js app, but you need a clear view of the entire operation flow to be able to identify performance bottlenecks before you launch. But how do you get started? Get the essentials on tracing for Next.js from @nikolovlazar in this video series 👀

Watch the Youtube series

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay