Como posso fazer uma boa estratégia de armazenamento em cache?

Erick Giorgio
Troopers-Legacy
Published in
5 min readMar 24, 2023

Independente da linguagem, mais cedo ou mais tarde no desenvolvimento teremos que lidar com cache. Com o crescimento do negócio é inevitável ter um número grande de acessos. E não da pra ficar escalando infinitamente a infra da aplicação ou do banco.

Cache

Cache é um mecanismo de armazenamento usado para reduzir os tempos de acesso aos dados. Funciona armazenando dados previamente acessados e/ou processados em um local de memória de acesso rápido, de modo que eles possam ser recuperados mais rapidamente quando necessário. Isso permite que os usuários obtenham os dados que eles precisam imediatamente, sem ter que esperar por um período de tempo significativo.

Imagine que você está caminhando por um bosque escuro. Você tem uma lanterna, mas a bateria está fraca. Você não tem tempo de parar e carregar a bateria, você mantém algumas baterias extras na sua mochila, para que você possa rapidamente substituir a bateria da lanterna quando precisar. Essa é a tática chamada “cache”.

Algumas estratégias comuns de manutenção de cache e suas vantagens e desvantagens.

Carregamento lento (lazy loading)

É uma estratégia que carrega os dados somente quando necessário

Vamos pegar por exemplo um cache que faz o armazenamento de chave-valor. Como o redis ou um Amazon ElasticCache

Ao invés da sua aplicação ir diretamente no banco de dados ele vai primeiro ao cache para buscar a informação. Se os dados existirem no cache e forem atuais, o cache os retornará ao seu aplicativo. Caso os dados não existam no cache ou tenham expirado, o aplicativo os solicita do seu armazenamento de dados. Em seguida seu aplicativo guarda os dados no cache. Dessa forma, ele poderá ser recuperado mais rapidamente na próxima vez que for solicitado.

Caso feliz

  1. Seu aplicativo solicita dados do cache.
  2. O cache retorna os dados para o aplicativo.

Caso triste

  1. Seu aplicativo solicita dados do cache.
  2. O cache não tem os dados solicitados, portanto, retorna um null.
  3. Seu aplicativo solicita e recebe os dados do banco de dados.
  4. O aplicativo atualiza o cache com os novos dados.

Diagrama descrevendo o fluxo

Vantagens

  1. Apenas dados solicitados são armazenados em cache.
  2. Como a maioria dos dados nunca é solicitada, o carregamento lento evita o preenchimento do cache com dados que não são solicitados.
  3. Os dados mais solicitados não precisam ser consultados no banco de dados em todas requisições

Desvantagens

  1. Existe uma penalidade de ausência no cache. Cada perda no cache resulta em três viagens:
  2. Solicitação inicial de dados do cache
  3. Consulta do banco de dados para os dados
  4. Gravação de dados no cache
  5. Dados obsoletos.Se os dados forem gravados no cache somente quando houver uma ausência no cache, os dados no cache poderão ficar obsoletos.

Exemplo:

get_account_by_customer(customer_id)
customer_record = cache.get(customer_id)
if (customer_record == null) {
account_result = db.query("SELECT * FROM Accounts
WHERE customer_id == {0}", customer_id)
cache.set(customer_id, account_result) }
return customer_record

Gravação simultânea (write-through)

A estratégia de gravação simultânea (write-through) adiciona dados ou atualiza dados no cache sempre que eles são gravados no banco de dados.

Vantagens

  1. Os dados no cache nunca se tornam obsoletos.

Desvantagens

  1. Penalidade de gravação, cada gravação envolve duas viagens:
  2. Uma gravação no cache
  3. Uma gravação no banco de dados
  4. A maioria dos dados nunca é lida

Exemplo:

save_account(account_id, values)
account_record = db.query("UPDATE Account WHERE id = {0}", account_id, values)
cache.set(customer_id, account_record)
return success

Adicionar o TTL

Nas duas estratégias mostradas acima pode ser adicionado um tempo de vida ao cache fazendo com que os dados não fiquem obsoletos.

O que é paginação de cache?

A paginação de cache é uma estratégia que permite a recuperação de grandes quantidades de dados, dividindo-os em páginas menores e armazenando-as em cache. Dessa forma, apenas as páginas necessárias são recuperadas, reduzindo a quantidade de dados que precisam ser armazenados em cache e melhorando o desempenho da aplicação.

Como funciona a paginação de cache?

Para implementar a estratégia de paginação de cache, é necessário definir o tamanho e o número de páginas que serão armazenadas. Quando uma solicitação de dados é feita, o cache verifica se a página solicitada já está armazenada. Se não estiver, a página é carregada a partir do armazenamento de dados e então é armazenada em cache. Se a página já estiver armazenada, ela é retornada imediatamente.

Vantagens da paginação de cache

  1. Melhoria do desempenho: A paginação de cache reduz a quantidade de dados que precisam ser armazenados, melhorando o desempenho da aplicação.
  2. Economia de memória: Armazenar grandes quantidades de dados em cache pode consumir muita memória. Ao dividir os dados em páginas menores, apenas as páginas necessárias são armazenadas em cache, economizando memória.
  3. Redução do tempo de carregamento: Ao armazenar apenas as páginas necessárias em cache, o tempo de carregamento é reduzido, melhorando a experiência do usuário.

Desvantagens da paginação de cache

  1. Complexidade: A implementação da paginação de cache pode ser complexa, especialmente em sistemas com grandes quantidades de dados.

Guardando a primeira página dos resultados

Vamos supor que temos um sistema de comentários paginados onde a primeira página vem sempre com os comentários mais recentes.

Pode ser inserido usando a estratégia de lazy loading para

  1. Consultar a primeira página.
  2. Consulta a lista no cache
  3. Lista vai estar vazia
  4. Consulta o banco.
  5. Salva a lista no cache.
  6. Devolve o resultado

E também podemos usar a estratégia de gravação simultânea
Ao criar um novo registro (comentário)

  1. Grava no banco
  2. Grava no cache

Quando encher a lista podemos excluir o primeiro que entrou.

Conclusão.

A estratégia de paginação de cache é uma técnica eficaz para otimizar o armazenamento de dados. Ao dividir grandes quantidades de dados em páginas menores, apenas as páginas necessárias são armazenadas em cache, melhorando o desempenho da aplicação e economizando memória. No entanto, a implementação da paginação de cache pode ser complexa. É importante avaliar cuidadosamente se essa estratégia é adequada para o seu sistema. Este foi um exemplo de utilização de cache. Não é impeditivo usar uma ou todas as estratégias ao mesmo tempo, dependendo do cenário e problema a ser resolvido.

Espero ter ajudado. Até a próxima!

--

--