Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Observação
Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 10 deste artigo.
Advertência
Esta versão do ASP.NET Core não é mais suportada. Para obter mais informações, consulte a Política de suporte do .NET e .NET Core. Para a versão atual, consulte a versão .NET 10 deste artigo.
Por Rick Anderson e Tom Dykstra
Este artigo fornece uma visão geral da cache no ASP.NET Core com uma introdução ao cache em memória, distribuído, híbrido, de resposta e de saída.
Cache na memória
O cache na memória usa a memória do servidor para armazenar dados em cache. Este tipo de cache é adequado para um único servidor ou vários servidores que utilizam afinidade de sessão. A afinidade de sessão também é conhecida como sessões persistentes. Afinidade de sessão significa que as solicitações de um cliente são sempre roteadas para o mesmo servidor para processamento.
Para obter mais informações, consulte Cache na memória no ASP.NET Core e Solucionar problemas de afinidade de sessão do Gateway de Aplicativo do Azure.
Cache distribuída
Use um cache distribuído para armazenar dados quando o aplicativo estiver hospedado em uma nuvem ou farm de servidores. O cache é compartilhado entre os servidores que processam solicitações. Um cliente pode submeter um pedido que é tratado por qualquer servidor do grupo quando os dados em cache do cliente estão disponíveis. ASP.NET Core funciona com caches distribuídos SQL Server, Redis, Postgres e NCache .
Para obter mais informações, consulte Cache distribuído no ASP.NET Core.
HybridCache
A HybridCache API preenche lacunas nas APIs IDistributedCache e IMemoryCache.
HybridCache é uma classe abstrata com uma implementação padrão que lida com a maioria dos aspetos de salvar em cache e recuperar do cache.
Funcionalidades do HybridCache
HybridCache fornece as seguintes funcionalidades que não estão disponíveis com outras APIs:
Uma API unificada para cache em processo e fora do processo.
HybridCachefoi projetado para ser um substituto imediato para o uso deIDistributedCacheeIMemoryCacheexistentes e fornece uma API simples para adicionar novo código de cache. Se o aplicativo tiver uma implementaçãoIDistributedCache, o serviçoHybridCacheo usará para cache secundário. Essa estratégia de cache de dois níveis permite queHybridCacheforneça a velocidade de um cache na memória e a durabilidade de um cache distribuído ou persistente.Proteção contra debandada.
Invasão de cache acontece quando uma entrada de cache usada com frequência é revogada e demasiadas solicitações tentam repopular a mesma entrada de cache ao mesmo tempo.
HybridCachecombina operações simultâneas, o que garante que todos os pedidos para uma dada resposta aguardam que o primeiro pedido preencha a cache.Serialização configurável.
A serialização é configurada como parte do registro do serviço, com suporte para serializadores específicos de tipo e generalizados por meio dos métodos
WithSerializereWithSerializerFactory, encadeados a partir da chamadaAddHybridCache. Por defeito, o serviço gere internamente os tiposstringebyte[], e usa o namespaceSystem.Text.Jsonpara tudo o resto.HybridCachepode ser configurado para outros tipos de serializadores, como protobuf ou XML.
Para ver a relativa simplicidade da API HybridCache, compare o código que a usa com o código que usa IDistributedCache. Aqui está um exemplo de como é usar IDistributedCache:
public class SomeService(IDistributedCache cache)
{
public async Task<SomeInformation> GetSomeInformationAsync
(string name, int id, CancellationToken token = default)
{
var key = $"someinfo:{name}:{id}"; // Unique key for this combination.
var bytes = await cache.GetAsync(key, token); // Try to get from cache.
SomeInformation info;
if (bytes is null)
{
// Cache miss; get the data from the real source.
info = await SomeExpensiveOperationAsync(name, id, token);
// Serialize and cache it.
bytes = SomeSerializer.Serialize(info);
await cache.SetAsync(key, bytes, token);
}
else
{
// Cache hit; deserialize it.
info = SomeSerializer.Deserialize<SomeInformation>(bytes);
}
return info;
}
// This is the work we're trying to cache.
private async Task<SomeInformation> SomeExpensiveOperationAsync(string name, int id,
CancellationToken token = default)
{ /* ... */ }
}
O código demonstra uma quantidade significativa de trabalho para acertar sempre, incluindo coisas como a serialização. Também no cenário de "cache miss", podes acabar com múltiplos threads em simultâneo. Estas threads podem todas receber um cache miss, todas recolhem os dados subjacentes, todas serializam-nos e todas enviam os dados para a cache.
Aqui está o código equivalente que utiliza a HybridCache API:
public class SomeService(HybridCache cache)
{
public async Task<SomeInformation> GetSomeInformationAsync
(string name, int id, CancellationToken token = default)
{
return await cache.GetOrCreateAsync(
$"someinfo:{name}:{id}", // Unique key for this entry.
async cancel => await SomeExpensiveOperationAsync(name, id, cancel),
token: token
);
}
}
O código é mais simples e a biblioteca oferece proteção contra debandada e outras funcionalidades que não estão disponíveis na IDistributedCache interface.
Compatibilidade
A biblioteca HybridCache suporta tempos de execução .NET mais antigos, incluindo .NET Framework 4.7.2 e .NET Standard 2.0.
Mais informações
Para obter mais informações, consulte os seguintes recursos:
- biblioteca HybridCache no ASP.NET Core
- Proposta de API de Cache Híbrida (GitHub dotnet/aspnetcore issue #54647)
- código-fonte do HybridCache
Cache de resposta
O middleware de cache de respostas permite o armazenamento em cache das respostas do servidor com base em cabeçalhos HTTP Cache-Control.
O comportamento de cache implementa a semântica padrão de cache HTTP.
A cache baseia-se em cabeçalhos de cache HTTP semelhantes ao método usado pelos proxies.
Esta forma de cache é útil para pedidos públicos de API GET ou HEAD de clientes onde as condições de cache são satisfeitas.
Para aplicações de interface como Razor o Pages, o cache de respostas normalmente não é benéfico. Os navegadores costumam definir cabeçalhos de pedidos que impedem o armazenamento em cache.
Output caching (disponível a partir de .NET 7) é uma abordagem melhor para aplicações de interface. Neste cenário, a configuração determina o que armazenar em cache independentemente dos cabeçalhos HTTP.
Para testar a cache de respostas, use o Fiddler ou outra ferramenta que possa definir explicitamente cabeçalhos de pedido. A configuração de cabeçalhos explicitamente é preferível para testar o cache. Para mais informações, veja Solução de Problemas > de middleware de cache de resposta.
Para obter mais informações, consulte cache de resposta no ASP.NET Core.
Cache de saída
O middleware de cache de saída permite o cache de respostas HTTP. O cache de saída difere do cache de resposta das seguintes maneiras:
O comportamento de cache é configurável no servidor.
O comportamento de cache de resposta é definido com cabeçalhos HTTP. Por exemplo, quando navega num site com Chrome ou Microsoft Edge, o navegador envia automaticamente um cabeçalho
Cache-control: max-age=0. Este cabeçalho desativa efetivamente a cache de respostas porque o servidor segue as instruções fornecidas pelo cliente. Uma nova resposta é retornada para cada solicitação, mesmo que o servidor tenha uma nova resposta em cache. Com a cache de saída, o cliente não altera o comportamento de cache que configurou no servidor.A mídia de armazenamento em cache é extensível.
A memória é usada por padrão. O cache de resposta é limitado à memória.
Você pode invalidar programaticamente as entradas de cache selecionadas.
A cache das respostas depende dos cabeçalhos HTTP, o que deixa poucas opções para invalidar entradas de cache.
O bloqueio de recursos reduz o risco de debandada de cache e rebanho trovejante.
Invasão de cache acontece quando uma entrada de cache usada com frequência é revogada e demasiadas solicitações tentam repopular a mesma entrada de cache ao mesmo tempo. do rebanho Thundering é semelhante: uma explosão de solicitações para a mesma resposta que ainda não está em uma entrada de cache. O bloqueio de recursos garante que todas as solicitações para uma determinada resposta aguardem até que a primeira solicitação preencha o cache. O cache de resposta não tem um recurso de bloqueio de recursos.
A revalidação de cache minimiza o uso de largura de banda.
A revalidação de cache significa que o servidor pode devolver um código de estado HTTP 304 Não Modificado em vez de um corpo de resposta em cache. Esse código de status informa ao cliente que a resposta à solicitação não foi alterada em relação ao que foi recebido anteriormente. O cache de resposta não faz a revalidação do cache.
Para obter mais informações, consulte middleware de cache de saída no ASP.NET Core.
Auxiliar de etiqueta de cache
Armazene em cache o conteúdo de uma vista MVC ou de uma página Razor com o assistente de cache. O Auxiliar de Tag de Cache usa cache na memória para armazenar dados.
Para obter mais informações, consulte Cache Tag Helper no ASP.NET Core MVC.
Auxiliar de tags de cache distribuído
Armazene o conteúdo de uma vista MVC ou de uma Página Razor em cache em cenários de nuvem distribuída ou em "web farms" com o Auxiliar de Tag de Cache Distribuído. O Auxiliar de Marca de Cache Distribuído usa o SQL Server, Redis ou NCache para armazenar dados.
Para obter mais informações, consulte Distributed Cache Tag Helper no ASP.NET Core.
Cache na memória
O cache na memória usa a memória do servidor para armazenar dados em cache. Esse tipo de cache é adequado para um único servidor ou vários servidores usando afinidade de sessão. A afinidade de sessão também é conhecida como sessões persistentes. Afinidade de sessão significa que as solicitações de um cliente são sempre roteadas para o mesmo servidor para processamento.
Para obter mais informações, consulte Cache na memória no ASP.NET Core e Solucionar problemas de afinidade de sessão do Gateway de Aplicativo do Azure.
Cache distribuído
Use um cache distribuído para armazenar dados quando o aplicativo estiver hospedado em uma nuvem ou farm de servidores. O cache é compartilhado entre os servidores que processam solicitações. Um cliente pode enviar uma solicitação que é tratada por qualquer servidor do grupo se os dados armazenados em cache para o cliente estiverem disponíveis. ASP.NET Core funciona com caches distribuídos SQL Server, Redis, Postgres e NCache .
Para obter mais informações, consulte Cache distribuído no ASP.NET Core.
HybridCache
A HybridCache API preenche lacunas nas APIs IDistributedCache e IMemoryCache.
HybridCache é uma classe abstrata com uma implementação padrão que lida com a maioria dos aspetos de salvar em cache e recuperar do cache.
Funcionalidades do HybridCache
HybridCache fornece as seguintes funcionalidades que não estão disponíveis com outras APIs:
Uma API unificada para cache em processo e fora do processo.
HybridCachefoi projetado para ser um substituto imediato para o uso deIDistributedCacheeIMemoryCacheexistentes e fornece uma API simples para adicionar novo código de cache. Se o aplicativo tiver uma implementaçãoIDistributedCache, o serviçoHybridCacheo usará para cache secundário. Essa estratégia de cache de dois níveis permite queHybridCacheforneça a velocidade de um cache na memória e a durabilidade de um cache distribuído ou persistente.Proteção contra debandada.
Invasão de cache acontece quando uma entrada de cache usada com frequência é revogada e demasiadas solicitações tentam repopular a mesma entrada de cache ao mesmo tempo.
HybridCachecombina operações simultâneas, o que garante que todos os pedidos para uma dada resposta aguardam que o primeiro pedido preencha a cache.Serialização configurável.
A serialização é configurada como parte do registro do serviço, com suporte para serializadores específicos de tipo e generalizados por meio dos métodos
WithSerializereWithSerializerFactory, encadeados a partir da chamadaAddHybridCache. Por defeito, o serviço gere internamente os tiposstringebyte[], e usa o namespaceSystem.Text.Jsonpara tudo o resto.HybridCachepode ser configurado para outros tipos de serializadores, como protobuf ou XML.
Para ver a relativa simplicidade da API HybridCache, compare o código que a usa com o código que usa IDistributedCache. Aqui está um exemplo de como é usar IDistributedCache:
public class SomeService(IDistributedCache cache)
{
public async Task<SomeInformation> GetSomeInformationAsync
(string name, int id, CancellationToken token = default)
{
var key = $"someinfo:{name}:{id}"; // Unique key for this combination.
var bytes = await cache.GetAsync(key, token); // Try to get from cache.
SomeInformation info;
if (bytes is null)
{
// Cache miss; get the data from the real source.
info = await SomeExpensiveOperationAsync(name, id, token);
// Serialize and cache it.
bytes = SomeSerializer.Serialize(info);
await cache.SetAsync(key, bytes, token);
}
else
{
// Cache hit; deserialize it.
info = SomeSerializer.Deserialize<SomeInformation>(bytes);
}
return info;
}
// This is the work we're trying to cache.
private async Task<SomeInformation> SomeExpensiveOperationAsync(string name, int id,
CancellationToken token = default)
{ /* ... */ }
}
O código demonstra uma quantidade significativa de trabalho para acertar sempre, incluindo coisas como a serialização. Também no cenário de "cache miss", podes acabar com múltiplos threads em simultâneo. Estas threads podem todas receber um cache miss, todas recolhem os dados subjacentes, todas serializam-nos e todas enviam os dados para a cache.
Aqui está o código equivalente que utiliza a HybridCache API:
public class SomeService(HybridCache cache)
{
public async Task<SomeInformation> GetSomeInformationAsync
(string name, int id, CancellationToken token = default)
{
return await cache.GetOrCreateAsync(
$"someinfo:{name}:{id}", // Unique key for this entry.
async cancel => await SomeExpensiveOperationAsync(name, id, cancel),
token: token
);
}
}
O código é mais simples e a biblioteca oferece proteção contra debandada e outras funcionalidades que não estão disponíveis na IDistributedCache interface.
Compatibilidade
A biblioteca HybridCache suporta tempos de execução .NET mais antigos, incluindo .NET Framework 4.7.2 e .NET Standard 2.0.
Mais informações
Para obter mais informações, consulte os seguintes recursos:
- biblioteca HybridCache no ASP.NET Core
- Proposta de API de Cache Híbrida (GitHub dotnet/aspnetcore issue #54647)
- código-fonte do HybridCache
Auxiliar de etiqueta de cache
Armazene em cache o conteúdo de uma vista MVC ou de uma página Razor com o assistente de cache. O Auxiliar de Tag de Cache usa cache na memória para armazenar dados.
Para obter mais informações, consulte Cache Tag Helper no ASP.NET Core MVC.
Auxiliar de tags de cache distribuído
Armazene o conteúdo de uma vista MVC ou de uma Página Razor em cache em cenários de nuvem distribuída ou em "web farms" com o Auxiliar de Tag de Cache Distribuído. O Auxiliar de Marca de Cache Distribuído usa o SQL Server, Redis ou NCache para armazenar dados.
Para obter mais informações, consulte Distributed Cache Tag Helper no ASP.NET Core.
Cache de resposta
O middleware de cache de respostas permite o armazenamento em cache das respostas do servidor com base nos cabeçalhos HTTP Cache-Control.
O comportamento de cache implementa a semântica padrão de cache HTTP.
A cache baseia-se em cabeçalhos de cache HTTP semelhantes ao método usado pelos proxies.
Esta forma de cache é útil para pedidos públicos de API GET ou HEAD de clientes onde as condições de cache são satisfeitas.
Para aplicações de interface como Razor o Pages, o cache de respostas normalmente não é benéfico. Os navegadores costumam definir cabeçalhos de pedidos que impedem o armazenamento em cache.
Output caching (disponível a partir de .NET 7) é uma abordagem melhor para aplicações de interface. Neste cenário, a configuração determina o que armazenar em cache independentemente dos cabeçalhos HTTP.
Para testar a cache de respostas, use o Fiddler ou outra ferramenta que possa definir explicitamente cabeçalhos de pedido. A configuração de cabeçalhos explicitamente é preferível para testar o cache. Para mais informações, veja Solução de Problemas > de middleware de cache de resposta.
Cache de saída
O middleware de cache de saída permite o cache de respostas HTTP. O cache de saída difere do cache de resposta das seguintes maneiras:
O comportamento de cache é configurável no servidor.
O comportamento de cache de resposta é definido por cabeçalhos HTTP. Por exemplo, quando visita um Website com o Chrome ou o Edge, o navegador envia automaticamente um cabeçalho
Cache-control: max-age=0. Esse cabeçalho efetivamente desativa o cache de resposta, uma vez que o servidor segue as instruções fornecidas pelo cliente. Uma nova resposta é retornada para cada solicitação, mesmo que o servidor tenha uma nova resposta em cache. Com o cache de saída, o cliente não substitui o comportamento de cache que você configura no servidor.A mídia de armazenamento em cache é extensível.
A memória é usada por padrão. O cache de resposta é limitado à memória.
Você pode invalidar programaticamente as entradas de cache selecionadas.
A dependência do cache de resposta em cabeçalhos HTTP deixa você com poucas opções para invalidar entradas de cache.
O bloqueio de recursos reduz o risco de debandada de cache e rebanho trovejante.
Invasão de cache acontece quando uma entrada de cache usada com frequência é revogada e demasiadas solicitações tentam repopular a mesma entrada de cache ao mesmo tempo. do rebanho Thundering é semelhante: uma explosão de solicitações para a mesma resposta que ainda não está em uma entrada de cache. O bloqueio de recursos garante que todas as solicitações para uma determinada resposta aguardem até que a primeira solicitação preencha o cache. O cache de resposta não tem um recurso de bloqueio de recursos.
A revalidação de cache minimiza o uso de largura de banda.
A revalidação de cache significa que o servidor pode retornar um código de status HTTP
304 Not Modifiedem vez de uma resposta em cache. Esse código de status informa ao cliente que a resposta à solicitação não foi alterada em relação ao que foi recebido anteriormente. O cache de resposta não faz a revalidação do cache.
Cache na memória
O cache na memória usa a memória do servidor para armazenar dados em cache. Esse tipo de cache é adequado para um único servidor ou vários servidores usando afinidade de sessão. A afinidade de sessão também é conhecida como sessões persistentes. Afinidade de sessão significa que as solicitações de um cliente são sempre roteadas para o mesmo servidor para processamento.
Para obter mais informações, consulte Cache na memória no ASP.NET Core e Solucionar problemas de afinidade de sessão do Gateway de Aplicativo do Azure.
Cache distribuído
Use um cache distribuído para armazenar dados quando o aplicativo estiver hospedado em uma nuvem ou farm de servidores. O cache é compartilhado entre os servidores que processam solicitações. Um cliente pode enviar uma solicitação que é tratada por qualquer servidor do grupo se os dados armazenados em cache para o cliente estiverem disponíveis. ASP.NET Core funciona com caches distribuídos SQL Server, Redis, Postgres e NCache .
Para obter mais informações, consulte Cache distribuído no ASP.NET Core.
HybridCache
A HybridCache API preenche lacunas nas APIs IDistributedCache e IMemoryCache.
HybridCache é uma classe abstrata com uma implementação padrão que lida com a maioria dos aspetos de salvar em cache e recuperar do cache.
Funcionalidades do HybridCache
HybridCache fornece as seguintes funcionalidades que não estão disponíveis com outras APIs:
Uma API unificada para cache em processo e fora do processo.
HybridCachefoi projetado para ser um substituto imediato para o uso deIDistributedCacheeIMemoryCacheexistentes e fornece uma API simples para adicionar novo código de cache. Se o aplicativo tiver uma implementaçãoIDistributedCache, o serviçoHybridCacheo usará para cache secundário. Essa estratégia de cache de dois níveis permite queHybridCacheforneça a velocidade de um cache na memória e a durabilidade de um cache distribuído ou persistente.Proteção contra debandada.
Invasão de cache acontece quando uma entrada de cache usada com frequência é revogada e demasiadas solicitações tentam repopular a mesma entrada de cache ao mesmo tempo.
HybridCachecombina operações simultâneas, o que garante que todos os pedidos para uma dada resposta aguardam que o primeiro pedido preencha a cache.Serialização configurável.
A serialização é configurada como parte do registro do serviço, com suporte para serializadores específicos de tipo e generalizados por meio dos métodos
WithSerializereWithSerializerFactory, encadeados a partir da chamadaAddHybridCache. Por defeito, o serviço gere internamente os tiposstringebyte[], e usa o namespaceSystem.Text.Jsonpara tudo o resto.HybridCachepode ser configurado para outros tipos de serializadores, como protobuf ou XML.
Para ver a relativa simplicidade da API HybridCache, compare o código que a usa com o código que usa IDistributedCache. Aqui está um exemplo de como é usar IDistributedCache:
public class SomeService(IDistributedCache cache)
{
public async Task<SomeInformation> GetSomeInformationAsync
(string name, int id, CancellationToken token = default)
{
var key = $"someinfo:{name}:{id}"; // Unique key for this combination.
var bytes = await cache.GetAsync(key, token); // Try to get from cache.
SomeInformation info;
if (bytes is null)
{
// Cache miss; get the data from the real source.
info = await SomeExpensiveOperationAsync(name, id, token);
// Serialize and cache it.
bytes = SomeSerializer.Serialize(info);
await cache.SetAsync(key, bytes, token);
}
else
{
// Cache hit; deserialize it.
info = SomeSerializer.Deserialize<SomeInformation>(bytes);
}
return info;
}
// This is the work we're trying to cache.
private async Task<SomeInformation> SomeExpensiveOperationAsync(string name, int id,
CancellationToken token = default)
{ /* ... */ }
}
O código demonstra uma quantidade significativa de trabalho para acertar sempre, incluindo coisas como a serialização. Também no cenário de "cache miss", podes acabar com múltiplos threads em simultâneo. Estas threads podem todas receber um cache miss, todas recolhem os dados subjacentes, todas serializam-nos e todas enviam os dados para a cache.
Aqui está o código equivalente que utiliza a HybridCache API:
public class SomeService(HybridCache cache)
{
public async Task<SomeInformation> GetSomeInformationAsync
(string name, int id, CancellationToken token = default)
{
return await cache.GetOrCreateAsync(
$"someinfo:{name}:{id}", // Unique key for this entry.
async cancel => await SomeExpensiveOperationAsync(name, id, cancel),
token: token
);
}
}
O código é mais simples e a biblioteca oferece proteção contra debandada e outras funcionalidades que não estão disponíveis na IDistributedCache interface.
Compatibilidade
A biblioteca HybridCache suporta tempos de execução .NET mais antigos, incluindo .NET Framework 4.7.2 e .NET Standard 2.0.
Mais informações
Para obter mais informações, consulte os seguintes recursos:
- biblioteca HybridCache no ASP.NET Core
- Proposta de API de Cache Híbrida (GitHub dotnet/aspnetcore issue #54647)
- código-fonte do HybridCache
Auxiliar de etiqueta de cache
Armazene em cache o conteúdo de uma vista MVC ou de uma página Razor com o assistente de cache. O Auxiliar de Tag de Cache usa cache na memória para armazenar dados.
Para obter mais informações, consulte Cache Tag Helper no ASP.NET Core MVC.
Auxiliar de tags de cache distribuído
Armazene o conteúdo de uma vista MVC ou de uma Página Razor em cache em cenários de nuvem distribuída ou em "web farms" com o Auxiliar de Tag de Cache Distribuído. O Auxiliar de Marca de Cache Distribuído usa o SQL Server, Redis ou NCache para armazenar dados.
Para obter mais informações, consulte Distributed Cache Tag Helper no ASP.NET Core.
Cache de resposta
O middleware de cache de respostas possibilita a armazenagem em cache das respostas do servidor com base em cabeçalhos HTTP Cache-Control.
O comportamento de cache implementa a semântica padrão de cache HTTP.
A cache baseia-se em cabeçalhos de cache HTTP semelhantes ao método usado pelos proxies.
Esta forma de cache é útil para pedidos públicos de API GET ou HEAD de clientes onde as condições de cache são satisfeitas.
Para aplicações de interface como Razor o Pages, o cache de respostas normalmente não é benéfico. Os navegadores costumam definir cabeçalhos de pedidos que impedem o armazenamento em cache.
Output caching (disponível a partir de .NET 7) é uma abordagem melhor para aplicações de interface. Neste cenário, a configuração determina o que armazenar em cache independentemente dos cabeçalhos HTTP.
Para testar a cache de respostas, use o Fiddler ou outra ferramenta que possa definir explicitamente cabeçalhos de pedido. A configuração de cabeçalhos explicitamente é preferível para testar o cache. Para mais informações, veja a Resolução de Problemas do middleware de cache de resposta.
Cache de saída
O cache de saída está disponível no .NET 7 ou posterior.