Skip to main content

Cache | System Design

  • Cache | System Design

Quando usar

  • Deve ser analisado a questão de sobrecarga do banco. As vezes não é necessário usar o cache, talvez uma otimização de consulta, uma view já solucionaria
  • Precisa ter métricas para colocar cache. Usa se um APM para monitorar para tomar a decisão. Com isso você descobre onde está o gargalho e tenta melhorar aquele ponto, seja com cache, seja com índice no banco ou outra estratégia.

Informações

  • IMPORTANTE: Se for criar várias máquinas com kubernetes, o cache fornecido pela aplicação fica na máquina e cada máquina vai ter o seu cache. Nesses casos seria o correto usar o Redis
  • CDNs são usados para cachear arquivos estáticos. Algumas emissoras de televisão usam e a NetFlix também
  • Quando pensar em adicionar um cache, deve ser analisado se as informações no cache não vão ficar desatualizadas
    • Deve se analisar o Reade-Write Ratio, pois pode ser 1/10, ou seja, mais escritas que leitura e isso faria com que o cache ficasse desatualizado
  • Deve ser pensando também no Cache eviction que é, o que vai acontecer com os dados quando não tiver mais memória
    • Explicação do cache eviction

      "Cache eviction" é um termo usado em computação para descrever o processo de remoção de dados de um cache. Um cache é uma camada de armazenamento temporário que guarda cópias de dados frequentemente acessados, visando acelerar o acesso a esses dados. Como o espaço em cache é geralmente limitado, eventualmente se torna necessário remover alguns dados para dar espaço a novos. Esse processo de remoção é chamado de "eviction" (despejo, em tradução livre).

      Existem vários algoritmos de cache eviction, cada um com sua própria estratégia para decidir quais dados remover. Alguns dos mais comuns incluem:

      1. Least Recently Used (LRU) (DEFAULT): Este algoritmo remove os dados que foram usados há mais tempo. O raciocínio é que se um dado não foi acessado recentemente, é menos provável que seja acessado novamente em breve.

      2. First In, First Out (FIFO): Aqui, os dados são removidos na ordem em que foram adicionados ao cache. O primeiro dado que entrou é o primeiro a ser removido, independentemente de sua frequência ou recenticidade de acesso.

      3. Least Frequently Used (LFU): Este algoritmo dá prioridade para a remoção de dados que foram menos acessados. A ideia é que dados raramente acessados são menos valiosos para manter no cache.

      4. Random Replacement (RR): Como o nome sugere, este algoritmo remove um dado aleatório do cache. É simples e não requer o rastreamento do histórico de acesso dos dados, mas pode não ser tão eficiente quanto outros métodos.

      Cada algoritmo tem seus prós e contras e pode ser mais adequado para diferentes tipos de aplicações e padrões de acesso a dados. A escolha do algoritmo de eviction certo é crucial para garantir a eficiência do cache, maximizando o benefício de ter dados rapidamente acessíveis sem consumir recursos desnecessariamente.

  • O Expiration Policy é o tempo que o cache irá ficar em memória
    • É usado a sigla TTL (Time to Live)

🔍 Leia estratégias:

𝗖𝗮𝗰𝗵𝗲 𝗔𝘀𝗶𝗱𝗲 (carregamento lento)

  • Como funciona: primeiro tenta o cache e depois busca no banco de dados em caso de falha no cache
  • Uso: quando as falhas de cache são raras ou a latência de uma falha de cache + leitura do banco de dados é aceitável

𝗥𝗲𝗮𝗱 𝗧𝗵𝗿𝗼𝘂𝗴𝗵

  • Como funciona: o cache lida com leituras de banco de dados, buscando de forma transparente os dados ausentes em caso de perda de cache
  • Uso: abstrai a lógica do banco de dados do código do aplicativo. Mantém o cache preenchido de forma consistente, lidando com erros automaticamente

📝 Estratégias de escrita:

𝗪𝗿𝗶𝘁𝗲 𝗔𝗿𝗼𝘂𝗻𝗱

  • Como funciona: As escritas ignoram o cache e vão direto para o BD
  • Uso: quando os dados gravados não serão lidos imediatamente do cache

𝗪𝗿𝗶𝘁𝗲 𝗕𝗮𝗰𝗸 (gravação atrasada)

  • Como funciona: grava primeiro no cache, depois grava assíncronamente no banco de dados
  • Uso: em ambientes com uso intenso de gravação, onde uma leve perda de dados é tolerável

𝗪𝗿𝗶𝘁𝗲 𝗧𝗵𝗿𝗼𝘂𝗴𝗵

  • Como funciona: gravação imediata no cache e no banco de dados
  • Uso: quando a consistência dos dados é crítica

🚀 Uso na vida real:

𝗖𝗮𝗰𝗵𝗲 𝗔𝘀𝗶𝗱𝗲 + 𝗪𝗿𝗶𝘁𝗲 𝗧𝗵𝗿𝗼𝘂𝗴𝗵

Isso garante uma sincronização consistente de cache/banco de dados, ao mesmo tempo que permite um controle refinado da população de cache durante as leituras. Gravações imediatas no banco de dados podem sobrecarregar o banco de dados.

𝗥𝗲𝗮𝗱 𝗧𝗵𝗿𝗼𝘂𝗴𝗵 + 𝗪𝗿𝗶𝘁𝗲 𝗕𝗮𝗰𝗸

Isso abstrai o banco de dados e lida bem com o tráfego de gravação intermitente, atrasando a sincronização. No entanto, há um risco maior de perda de dados se o cache ficar inativo antes de sincronizar as gravações em buffer no banco de dados.

alt text