Pular para conteúdo

Cache de Aplicação

Um cache mantém uma cópia reutilizável mais próxima do consumidor para reduzir latência, carga ou custo. Ele troca atualidade e simplicidade por reutilização. Antes de adicioná-lo, meça a operação subjacente e verifique se um índice, uma mudança na consulta, um lote ou um cálculo local mais simples resolveria a causa.

Estratégias comuns de acesso

Estratégia Comportamento de leitura e escrita Consequência importante
Cache-aside A aplicação carrega após um miss e invalida ou atualiza depois da escrita A aplicação trata as corridas
Read-through A abstração do cache carrega dados ausentes O carregador integra o contrato do cache
Write-through A escrita termina no cache e no armazenamento de forma síncrona Maior latência de escrita, atualidade mais simples na leitura
Write-behind O cache confirma antes da persistência assíncrona Exige política para perda e ordenação dos dados

O time-to-live limita a idade; o tamanho máximo limita o espaço. Nenhum deles prova atualidade. Chaves versionadas e invalidação por eventos reduzem janelas de obsolescência, mas acrescentam coordenação. Todo projeto deve declarar se aceita dados obsoletos e o que ocorre quando o cache fica indisponível.

Chaves e valores corretos

As chaves devem incluir todas as dimensões que afetam a resposta, especialmente tenant, escopo de autorização, localidade, versão da representação e parâmetros da consulta. Valores mutáveis em cache podem vazar alterações entre chamadores; prefira snapshots imutáveis ou cópias defensivas. Trate resultados negativos separadamente, pois uma ausência pode exigir vida curta.

Stampedes e cargas concorrentes

Quando uma entrada popular expira, muitos chamadores podem recarregá-la ao mesmo tempo. Esse cache stampede pode sobrecarregar a fonte. Entre os controles estão coalescência de requisições, carga single-flight limitada, expiração aleatória, atualização antecipada e entrega explícita de um valor obsoleto por tempo limitado. Cada opção precisa de timeout e política para falha do carregador; manter um lock durante uma chamada externa pode se tornar outra indisponibilidade.

Cache de métodos no Spring

O @Cacheable do Spring oferece cache declarativo de métodos por uma abstração. No modo comum baseado em proxy, somente chamadas que atravessam o proxy são interceptadas; a autoinvocação não ativa o cache. Expressões de chave, gerenciador, serialização, expiração e remoção continuam sendo decisões da aplicação. Não presuma que adicionar a anotação define consistência.

@Cacheable(cacheNames = "catalog", key = "#sku")
public ProductView findProduct(String sku) {
    return catalogClient.fetch(sku);
}

Teste e observe

  • teste miss, hit, expiração, remoção, invalidação e falha da fonte;
  • exercite misses concorrentes para a mesma chave;
  • meça taxa de acerto, latência de carga, remoções, tamanho e falhas de carga;
  • evite IDs de usuário ou chaves como rótulos de métricas sem limite;
  • verifique se a falha do cache degrada segundo o contrato declarado.

Consulte a abstração de cache do Spring.