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.