Cache compartilhado - prática recomendada de invalidação


14

Gostaria de saber qual seria a melhor abordagem para invalidar / atualizar objetos de cache.

Pré-requisitos

  • Ter servidor memcached remoto (servindo como cache para vários aplicativos)
  • Todos os servidores são hospedados pelo azure (regiões de afinidade, mesmos data centers)
  • O tamanho do objeto de cache varia de 200 bytes a 50 kilobytes


Abordagem 1 (armazenar no cache o mais rápido possível)

  1. O objeto A é criado -> armazenar no banco de dados e armazenar no cache
  2. Objeto A solicitado pelo cliente -> verificar a existência de cache, caso contrário, buscar no banco de dados e armazenar no cache
  3. O objeto A é atualizado -> armazenar no banco de dados, armazenar no cache

A abordagem 1 parece ser mais direta. Se algo for criado, coloque no cache o mais rápido possível. Independentemente de alguém vai precisar.


Abordagem 2 (armazenamento lento do cache)

  1. O objeto A é criado -> armazenar no banco de dados
  2. Objeto A solicitado pelo cliente -> verificar a existência de cache, caso contrário, buscar no banco de dados e armazenar no cache
  3. O objeto A é atualizado -> armazenar no banco de dados, excluir chave no cache

A abordagem 2 parece ter mais consciência da memória. Nesta abordagem, apenas os itens solicitados vão para o cache.


Pergunta 1: Tendo em vista o desempenho, qual seria uma abordagem melhor? A memória nem a CPU ainda não contam.

Pergunta 2: Meus pensamentos são uma espécie de otimização prematura?

Pergunta 3: Quaisquer outros pensamentos? Outras abordagens?

Respostas:


12
  1. Não pode ser respondido, exceto para dizer que depende. Existem muitos fatores que determinarão qual abordagem será a melhor para o seu caso, por exemplo: É normal que objetos criados sejam recuperados logo após serem criados? Qual é a proporção de atualizações para acessos?
  2. Ré. decidindo que você precisa de um cache: se você está otimizando sem dados, sim, é otimização tecnicamente prematura. Digo tecnicamente, já que a experiência / sabedoria convencional pode dizer que você precisará de algum tipo de cache. Ré. decidir como o cache funcionará melhor: sim, é definitivamente uma otimização prematura.
    • A otimização geralmente não é encontrar a melhor / mais ótima solução. Deve ser da seguinte maneira:
      1. Encontre os gargalos no sistema.
      2. Descubra onde você pode fazer a maior diferença com a menor quantidade de trabalho.
      3. Faça a menor quantidade de trabalho!
      4. Já é rápido o suficiente? Caso contrário, vá para o número 1.
      5. Feito!
    • Honestamente, nenhuma das abordagens que você descreve parece complicada. Por que não implementar os dois e ver qual funciona melhor?
    • A etapa 3 da abordagem nº 2 pode ser alterada para "O objeto A é atualizado -> armazenar no banco de dados, atualizar a entrada no cache".

Baqueta, obrigado pela sua resposta. Eu aprecio isso.
Lurkerbelow 20/01

@lurkerbelow Fico feliz em ajudar.
vaughandroid

2

O memcached gerencia objetos com sua própria política, que objeto em cache expiraria se ninguém acessá-lo ou se o memcached ficar sem memória. Portanto, sua primeira abordagem não é uma boa ideia, pois seu objeto no memcached continuaria sendo invalidado devido à falta de memória ao criar objetos.

Q1 A abordagem 2 seria melhor em termos de desempenho, porque não envia objetos para o cache de memcached, embora a melhoria de desempenho seja muito pequena.

Q2 É difícil dizer. Suponha que você conheça o gargalo e elabore as abordagens, não seria prematuro.

Q3 Existem outras abordagens, como cache apenas no memcached.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.