paint-brush
Como melhorar a experiência do usuário e reduzir custos: veja por que você deve usar o cacheby@brilianfird
771
771

Como melhorar a experiência do usuário e reduzir custos: veja por que você deve usar o cache

Brilian Firdaus8m2024/05/10
Read on Terminal Reader

Hoje, estamos mergulhando no mundo do cache. O cache é uma arma secreta para a construção de sistemas escalonáveis e de alto desempenho. Existem muitos tipos de cache, mas neste artigo vamos nos concentrar no cache de objetos de back-end (cache de back-end). Dominá-lo o ajudará a construir software confiável e de alto desempenho.
featured image - Como melhorar a experiência do usuário e reduzir custos: veja por que você deve usar o cache
Brilian Firdaus HackerNoon profile picture
0-item

Hoje, estamos mergulhando no mundo do cache. O cache é uma arma secreta para a construção de sistemas escalonáveis e de alto desempenho. Existem muitos tipos de cache, mas neste artigo vamos nos concentrar no cache de objetos de back-end (cache de back-end). Dominá-lo o ajudará a construir software confiável e de alto desempenho.


Neste artigo, exploraremos:

  1. O que é cache? Exploraremos o cache e explicaremos como ele armazena dados temporariamente para acesso mais rápido.


  2. Benefícios do cache : descubra como o cache aumenta a velocidade, reduz a carga do servidor, melhora a experiência do usuário e pode até reduzir custos.


  3. Padrão de cache : nesta seção, veremos diferentes maneiras de usar o cache. Lembre-se de que cada abordagem tem prós e contras, portanto, escolha o padrão certo para suas necessidades!


  4. Prática recomendada de armazenamento em cache : agora você sabe como armazenar e recuperar dados armazenados em cache. Mas como você garante que seus dados em cache permaneçam atualizados? E o que acontece quando o cache atinge sua capacidade?


  5. Quando não armazenar em cache : embora o armazenamento em cache ofereça muitos benefícios, há momentos em que é melhor evitá-lo. A implementação do cache no sistema errado pode aumentar a complexidade e potencialmente até mesmo diminuir o desempenho.

O que é cache?

Criar um aplicativo escalonável e de alto desempenho envolve remover gargalos e tornar o sistema mais eficiente. Os bancos de dados geralmente causam gargalos no desempenho do sistema devido aos seus requisitos de armazenamento e processamento. Isso os torna um componente caro porque precisam ser ampliados com frequência.


Felizmente, existe um componente que pode ajudar a descarregar o uso de recursos do banco de dados e, ao mesmo tempo, melhorar a velocidade de recuperação de dados – esse componente é chamado cache .


Cache é um armazenamento temporário projetado para gravação e leitura rápida de dados. Ele usa armazenamento de memória de baixa latência e estruturas de dados otimizadas para operações rápidas. Provavelmente você já usou Redis ou Memcached, ou pelo menos ouviu seus nomes. Estes são dois dos sistemas de cache distribuído mais populares para serviços de back-end. O Redis pode até atuar como banco de dados primário, mas isso é assunto para outro artigo!

Benefícios do cache

O principal benefício do cache é a sua velocidade. Ler dados de um cache é significativamente mais rápido do que recuperá-los de um banco de dados (como SQL ou Mongo). Essa velocidade vem de caches que usam estruturas de dados de dicionário (ou HashMap) para operações rápidas e armazenamento de dados em memória de alta velocidade em vez de em disco.


Em segundo lugar, o cache reduz a carga no seu banco de dados. Isso permite que os aplicativos obtenham os dados necessários do cache, em vez de acessar constantemente o banco de dados. Isto diminui drasticamente o uso de recursos de hardware; em vez de procurar dados no disco, seu sistema simplesmente os acessa a partir da memória rápida.


Esses benefícios melhoram diretamente a experiência do usuário e podem levar à economia de custos. Seu aplicativo responde com muito mais rapidez, criando uma experiência mais tranquila e satisfatória para os usuários.


O cache reduz os custos de infraestrutura. Embora um sistema distribuído como o Redis exija recursos próprios, a economia geral costuma ser significativa. Seu aplicativo acessa dados com mais eficiência, potencialmente permitindo que você reduza seu banco de dados. No entanto, isso traz uma compensação: se o seu sistema de cache falhar, certifique-se de que seu banco de dados esteja preparado para lidar com o aumento de carga.

Padrões de cache

Agora que você entende o poder do cache, vamos mergulhar nas melhores maneiras de usá-lo! Nesta seção, exploraremos duas categorias essenciais de padrões: Cache Writing Patterns e Cache Miss Patterns . Esses padrões fornecem estratégias para gerenciar atualizações de cache e lidar com situações em que os dados necessários ainda não estão no cache.

Padrões de escrita

Os padrões de escrita determinam como seu aplicativo interage com o cache e com o banco de dados. Vejamos três estratégias comuns: Write-back , Write-through e Write-around . Cada um oferece vantagens e compensações exclusivas:

Escreva de volta


Padrão de cache de write-back

Como funciona:

  • Seu aplicativo interage apenas com o cache.
  • O cache confirma a gravação instantaneamente.
  • Um processo em segundo plano copia os dados recém-gravados no banco de dados.


Ideal para: Aplicativos com uso intenso de gravação, onde a velocidade é crítica e alguma inconsistência é aceitável por uma questão de desempenho. Os exemplos incluem aplicações de métricas e análises.


Vantagens:

  • Leituras mais rápidas: os dados estão sempre no cache para acesso rápido, ignorando totalmente o banco de dados.
  • Gravações mais rápidas: seu aplicativo não espera por gravações no banco de dados, resultando em tempos de resposta mais rápidos.
  • Menos esforço do banco de dados: as gravações em lote reduzem a carga do banco de dados e podem potencialmente estender a vida útil do hardware do seu banco de dados.


Desvantagens:

  • Risco de perda de dados: Se o cache falhar antes que os dados sejam salvos no banco de dados, as informações poderão ser perdidas. O Redis mitiga esse risco com armazenamento persistente, mas isso aumenta a complexidade.


  • Maior complexidade: você precisará de um middleware para garantir que o cache e o banco de dados permaneçam sincronizados.


  • Potencial para alto uso de cache: todas as gravações vão primeiro para o cache, mesmo que os dados não sejam lidos com frequência. Isso pode levar a um alto consumo de armazenamento.

Escreva através


Política de cache de gravação

Como funciona:

  • Seu aplicativo grava no cache e no banco de dados simultaneamente.


  • Para reduzir o tempo de espera, você pode gravar no cache de forma assíncrona. Isso permite que seu aplicativo sinalize gravações bem-sucedidas antes que a operação de cache seja completamente concluída.


Vantagens:

  • Leituras mais rápidas: Assim como o Write-Back, os dados estão sempre no cache, eliminando a necessidade de leituras do banco de dados.


  • Confiabilidade: Sua aplicação só confirma uma gravação após ela ser salva no banco de dados, garantindo a persistência dos dados mesmo que ocorra uma falha imediatamente depois.


Desvantagens:

  • Gravações mais lentas: em comparação com o Write-Back, esta política tem alguma sobrecarga porque o aplicativo aguarda a gravação do banco de dados e do cache. As gravações assíncronas melhoram isso, mas lembre-se, sempre há o tempo de espera do banco de dados.


  • Alto uso de cache: todas as gravações vão para o cache, consumindo potencialmente armazenamento mesmo que os dados não sejam acessados com frequência.

Escreva por aí


Padrão de cache de gravação

Com o Write-Around, seu aplicativo grava dados diretamente no banco de dados, ignorando o cache durante o processo de gravação. Para preencher o cache, ele emprega uma estratégia chamada padrão cache-aside :


  1. Chega a solicitação de leitura: o aplicativo verifica o cache.


  2. Falta de cache: se os dados não forem encontrados no cache, o aplicativo os busca no banco de dados e os armazena no cache para uso futuro.


Vantagens:

  • Gravações confiáveis: os dados são gravados diretamente no banco de dados, garantindo consistência.
  • Uso eficiente do cache: apenas os dados acessados com frequência são armazenados em cache, reduzindo o consumo de memória.


Desvantagens:

  • Maior latência de leitura (em alguns casos): se os dados não estiverem no cache, o aplicativo deverá buscá-los no banco de dados, adicionando uma viagem de ida e volta em comparação com políticas em que o cache é sempre pré-preenchido.

Padrão de falta de cache


Padrão de falta de cache

Uma falta de cache ocorre quando os dados que seu aplicativo precisa não são encontrados no cache. Aqui estão duas estratégias comuns para lidar com isso:


  1. Cache à parte
    • O aplicativo verifica o cache.

    • Em caso de erro, ele busca dados do banco de dados e atualiza o cache.

    • Ponto chave: O aplicativo é responsável por gerenciar o cache.


Usar um padrão Cache-Aside significa que seu aplicativo gerenciará o cache. Essa abordagem é a mais comum de usar porque é simples e não precisa de desenvolvimento em outros locais além da aplicação


  1. Leia
    • O aplicativo faz uma solicitação sem saber do cache.

    • Um mecanismo especializado verifica o cache e busca dados do banco de dados, se necessário.

    • O cache é atualizado de forma transparente.


Os padrões de leitura reduzem a complexidade do aplicativo, mas aumentam a complexidade da infraestrutura. Em vez disso, ajuda a descarregar os recursos do aplicativo para o middleware.


No geral, o padrão write-around com cache-aside é mais comumente usado devido à sua facilidade de implementação. No entanto, recomendo incluir também o padrão write-through se você tiver algum dado que será usado imediatamente após ser armazenado em cache. Isso proporcionará um pequeno benefício no desempenho de leitura.

Práticas recomendadas de cache

Nesta seção, exploraremos as práticas recomendadas para usar um cache. Seguir essas práticas garantirá que seu cache mantenha dados atualizados e gerencie seu armazenamento de maneira eficaz.

Invalidação de cache

Imagine que você armazenou dados no cache e então o banco de dados foi atualizado. Isso faz com que os dados no cache sejam diferentes da versão do banco de dados. Chamamos esse tipo de dados de cache de "obsoletos". Sem uma técnica de invalidação de cache, os dados armazenados em cache poderão permanecer obsoletos após atualizações do banco de dados. Para manter os dados atualizados, você pode usar as seguintes técnicas:


  1. Invalidação de cache na atualização: ao atualizar dados no banco de dados, atualize também a entrada de cache correspondente. Os padrões write-through e write-back lidam inerentemente com isso, mas write-around/cache-aside requer a exclusão explícita dos dados armazenados em cache. Essa estratégia evita que seu aplicativo recupere dados obsoletos.


  2. Time To Live (TTL): TTL é uma política que você pode definir ao armazenar dados no cache. Com o TTL, os dados são excluídos automaticamente após um tempo especificado. Isso ajuda a limpar os dados não utilizados e fornece uma proteção contra falhas contra dados obsoletos em caso de invalidações perdidas.

Políticas de substituição de cache

Se você armazenar em cache uma grande quantidade de dados, o armazenamento em cache poderá ficar cheio. Os sistemas de cache normalmente usam memória, que geralmente é menor que o armazenamento do banco de dados primário. Quando o cache está cheio, é necessário excluir alguns dados para liberar espaço. As políticas de substituição de cache determinam quais dados remover:


  1. Menos usados recentemente (LRU): esta política comum remove dados que não foram usados (lidos ou gravados) há mais tempo. LRU é adequado para a maioria dos casos de uso do mundo real.


  2. Menos Frequentemente Usado (LFU): Semelhante ao LRU, mas concentra-se na frequência de acesso. Os dados recém-gravados podem ser removidos, portanto, considere adicionar um período de aquecimento durante o qual os dados não possam ser excluídos.


Outras políticas de substituição como FIFO (First-In, First-Out), Random Replacement, etc., existem, mas são menos comuns.

Quando não armazenar em cache

Antes de mergulhar na implementação do cache, é importante saber quando ele pode não ser a melhor opção. O cache geralmente melhora a velocidade e reduz a carga do banco de dados, mas pode não fazer sentido se:


  1. Tráfego baixo: se seu aplicativo tiver tráfego baixo e o tempo de resposta ainda for aceitável, provavelmente você ainda não precisará de cache. Adicionar um cache aumenta a complexidade, por isso é melhor implementado quando você enfrenta gargalos de desempenho ou antecipa um aumento significativo no tráfego.


  2. Seu sistema tem muita gravação: o cache é mais benéfico em aplicativos com muita leitura. Isso significa que os dados do seu banco de dados são atualizados com pouca frequência ou lidos várias vezes entre as atualizações. Se o seu aplicativo tiver um grande volume de gravações, o cache poderá adicionar sobrecarga e tornar as coisas mais lentas.

Aprendizado

Neste artigo, cobrimos os fundamentos do cache e como usá-lo de maneira eficaz. Aqui está uma recapitulação dos pontos principais:


  1. Confirme a necessidade: certifique-se de que seu sistema tenha muita leitura e exija as ofertas de cache de redução de latência.


  2. Escolha os padrões com sabedoria: selecione padrões de gravação em cache e de falta de cache que se alinhem com a forma como seu aplicativo usa os dados.


  3. Atualização de dados: implemente estratégias de invalidação de cache para evitar o fornecimento de dados obsoletos.


  4. Gerenciar política de substituição: escolha uma política de substituição de cache (como LRU) para lidar com exclusões quando o cache atingir sua capacidade.

Referências

  1. https://gist.github.com/jboner/2841832
  2. https://www.bytesizedpieces.com/posts/cache-types
  3. https://www.techtarget.com/searchstorage/definition/cache
  4. https://www.youtube.com/watch?v=dGAgxozNWFE