Principio: Cache e uma troca de consistencia por performance. Dados obsoletos sao aceitaveis? Por quanto tempo? Essas perguntas definem sua estrategia.

Cache-Aside Pattern

O padrao mais comum: a aplicacao verifica o cache primeiro. Em caso de miss, busca no banco, armazena no cache, e retorna. O cache nao conhece o banco β€” a aplicacao orquestra tudo.

HitMissRequestCheck CacheReturn cachedQuery DBStore in CacheReturn
TipoOnde armazenaEscopoQuando usar
In-MemoryHeap do processoPor instancia da appDados pequenos, leitura frequente, uma unica instancia
DistributedRedis, SQL Server, NCacheCompartilhado entre instanciasMultiplas instancias, dados maiores, persistencia alem do processo
HybridCache (.NET 9)L1 in-memory + L2 distributedAmbosMelhor dos dois mundos β€” L1 para velocidade, L2 para consistencia
Response CacheHTTP headers (CDN, browser)Cliente/proxyConteudo estatico, APIs read-only com Cache-Control
Output Cache (.NET 7+)Server-side, resposta inteiraPor instancia (ou distributed)Endpoints identicos para muitos usuarios

Estrategias de expiracao

TipoComportamentoExemplo
AbsoluteExpira em tempo fixo apos criacaoCategorias: 1 hora. Nao importa quantas vezes acessar.
SlidingExpira se nao acessado por X tempoSessao de usuario: 20 min de inatividade.
Absolute + SlidingSliding renova ate o limite absolutoSliding 5 min, absoluto 30 min. Evita cache eterno.
In-memory vs distributed cache β€” como escolher?
In-memory e mais rapido (nanossegundos, sem rede), mas cada instancia tem sua copia β€” inconsistencia entre pods. Distributed (Redis) garante uma unica fonte de verdade para todas as instancias, mas adiciona latencia de rede (~1ms). Para dados que mudam pouco e sao lidos milhares de vezes (categorias, config), in-memory e ideal. Para dados de sessao ou inventario compartilhado, distributed.