DEV Community

loading...

O que é cache ?

thierrysantos profile image Thierry Santos ・4 min read

O cache é uma camada de armazenamento de dados com uma alta velocidade de acesso. O acesso raṕido aos dados se da por normalmente estarem armazenados em memória.

Um dos objetivos do cache é possibilitar que você aumente a velocidade de acesso ao dado.

Aplicações de cache

Para conseguirmos entender melhor a aplicação do cache iremos desenvolver uma aplicação que realiza um uso intensivo de cpu realizando um calculo matemático(fibonnaci). Para desenvolver essa aplicação iremos utilizar o node e o banco de dados redis.

O que é o Redis

O redis é um banco de dados com uma estrutura chave-valor, com o armazenamento em memória. Segundo uma pesquisa realizada pela RisingStack quase 50% dos entrevistados utilizam o redis como cache.

Pesquisa sobre a utilização de cache

Inciando o projeto

Precisamos executar os comandos abaixo que inicia o projeto e instala as dependencias necessárias.

npm init -y
e
npm install ioredis
Enter fullscreen mode Exit fullscreen mode

O ioredis é um client para utilização do redis, mais informações sobre a biblioteca pode ser encontrado no github.

Desenvolvendo a solução

No package.json será necessário adicionar o script para executar a aplicação(O index.js é o arquivo que conterá toda a solução).

{
  "scripts": {
      "start": "node index.js"
  }
}
Enter fullscreen mode Exit fullscreen mode

E o resultado final será algo parecido com o exemplo abaixo.

{
  "name": "nodejs-and-cache",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
      "start": "node index.js"
  },
  "dependencies": {
    "ioredis": "^4.14.1"
  }
}
Enter fullscreen mode Exit fullscreen mode

Agora iremos importar nossas dependencias e se conectar com o redis.

    const Redis = require('ioredis')
    const redis = new Redis()

    // Abaixo são as formas que podemos utilizar para se connectar ao redis

    // new Redis(); // Connect to 127.0.0.1:6379
    // new Redis(6380); // 127.0.0.1:6380
    // new Redis(6379, "192.168.1.1"); // 192.168.1.1:6379
    // new Redis("/tmp/redis.sock");
    // new Redis({
    // port: 6379, // Redis port
    // host: "127.0.0.1", // Redis host
    // family: 4, // 4 (IPv4) or 6 (IPv6)
    // password: "auth",
    // db: 0
    // });
Enter fullscreen mode Exit fullscreen mode

Quando for inciar a aplicação será necessário passar o número que queremos calcular o Fibonacci.

npm start 5
Enter fullscreen mode Exit fullscreen mode

Para acessar o valor passado na execução da aplicação iremos utilizar o process.argv, essa variável possui dados da execução da aplicação.

[
  '/home/thierrysantos/.nvm/versions/node/v12.14.0/bin/node',
  '/home/thierrysantos/dev/tutorials/nodejs-and-cache/index.js',
  '2'
]
Enter fullscreen mode Exit fullscreen mode

Como vimos acima, o primeiro item está informando o path do node, o segundo é o path do arquivo que será executado e os demais são os parâmetros passados ao executar a aplicação. Para acessarmos o número precisamos adicionar o código abaixo.

// Obtem o número passado como parametro. Ex: npm start 12
const number = parseInt(process.argv[2], 10)
Enter fullscreen mode Exit fullscreen mode

Agora iremos adiconar a função que irá calcular o fibonacci, não vou entrar em muitos detalhes da função por que não é foco.

// Calcula o fibonacci
const fibonacci = (number = 0) => {
    if(number <= 1) return number
    return fibonacci(number - 1) + fibonacci(number - 2)
}
Enter fullscreen mode Exit fullscreen mode

Agora iremos criar a função que vai conter a lógica de cache e teremos o seguinte fluxo:

  • Verifica se o número passado como parametro está com o resultado em cache
  • Se o resultado estiver em cache, retorna o resultado
  • Senão ele realiza o calculo chamando a função fibonnaci, então armazena esse resultado no cache e retorna o resultado

Então na próxima vez que o mesmo número for passado o tempo de resposta será mais rápido pois ele já foi calculado.

const Redis = require('ioredis')
const redis = new Redis()
// Obtem o número passado como parametro. Ex: npm start 12
const number = parseInt(process.argv[2], 10)

// Calcula o fibonacci
const fibonacci = (number = 0) => {
    if(number <= 1) return number
    return fibonacci(number - 1) + fibonacci(number - 2)
}

const wrapperFibonacci = async (number = 0) => {
    // Verifica se o número passado como parametro se já com o resultado em cache
    const existsResult = await redis.get(`fibonacci:${number}`)
    // Se o resultado estiver em cache
    if(existsResult) {
        // Retorna o resultado
        return existsResult
    }
    // Senão ele realiza o calculo chamando a função fibonnaci, 
    const result =  fibonacci(number)
    // Então armazena esse resultado no cache
    redis.set(`fibonacci:${number}`, result)
    // Retorna o resultado
    return result
}

wrapperFibonacci(number).then(console.log)
Enter fullscreen mode Exit fullscreen mode

Esse foi um exemplo simples mostrando a aplicação do cache, nesse caso não teve a necessidade de adicionar um tempo de expiração(TTL) que faz com que o dado expire e seja removido do cache.

O repositório com o código pode ser acessado aqui.

Referências:

Web Scalability for Startup Engineers: https://amzn.to/37VPQb6
Cache: https://searchstorage.techtarget.com/definition/cache
What is Caching: https://aws.amazon.com/caching/
Time to live: https://www.imperva.com/learn/performance/time-to-live-ttl/

Discussion (0)

pic
Editor guide