Eu li muitas informações sobre o cache de páginas e o cache parcial de páginas em um aplicativo MVC. No entanto, gostaria de saber como você armazenaria os dados em cache.
No meu cenário, usarei o LINQ to Entities (estrutura da entidade). Na primeira chamada para GetNames (ou qualquer que seja o método), quero pegar os dados do banco de dados. Desejo salvar os resultados no cache e na segunda chamada para usar a versão em cache, se existir.
Alguém pode mostrar um exemplo de como isso funcionaria, onde isso deveria ser implementado (modelo?) E se funcionaria.
Eu já vi isso em aplicativos ASP.NET tradicionais, geralmente para dados muito estáticos.
asp.net-mvc
database
caching
Coolcoder
fonte
fonte
Respostas:
Consulte a dll System.Web no seu modelo e use System.Web.Caching.Cache
Um pouco simplificado, mas acho que funcionaria. Isso não é específico do MVC e eu sempre usei esse método para armazenar dados em cache.
fonte
DB.GetNames().AsQueryable
método de atrasar a consulta?Aqui está um serviço / classe auxiliar de cache agradável e simples que eu uso:
Uso:
O provedor de cache verificará se há algo com o nome de "ID do cache" no cache e, se não houver, chamará um método delegado para buscar dados e armazená-los no cache.
Exemplo:
fonte
Refiro-me à postagem de TT e sugiro a seguinte abordagem:
Consulte a dll System.Web no seu modelo e use System.Web.Caching.Cache
Você não deve retornar um valor relido a partir do cache, pois nunca saberá se naquele momento específico ele ainda está no cache. Mesmo se você o inseriu na declaração anterior, ele pode já ter desaparecido ou nunca ter sido adicionado ao cache - você simplesmente não sabe.
Portanto, você adiciona os dados lidos no banco de dados e os retorna diretamente, sem reler a partir do cache.
fonte
Cache["names"] = noms;
coloca no cache?Para o .NET 4.5+ framework
adicionar referência:
System.Runtime.Caching
adicione usando a instrução:
using System.Runtime.Caching;
Mais informações:
https://msdn.microsoft.com/en-us/library/dd997357(v=vs.110).aspx
https://docs.microsoft.com/en-us/dotnet/framework/performance/caching-in-net-framework-applications
fonte
Db.GerNames()
vem?Steve Smith fez duas ótimas postagens no blog que demonstram como usar seu padrão CachedRepository no ASP.NET MVC. Ele usa o padrão de repositório efetivamente e permite que você obtenha o armazenamento em cache sem precisar alterar o código existente.
http://ardalis.com/Introducing-the-CachedRepository-Pattern
http://ardalis.com/building-a-cachedrepository-via-strategy-pattern
Nessas duas postagens, ele mostra como configurar esse padrão e também explica por que é útil. Ao usar esse padrão, você obtém o cache sem que seu código existente veja nenhuma lógica de cache. Essencialmente, você usa o repositório em cache como se fosse qualquer outro repositório.
fonte
O AppFabric Caching é distribuído e uma técnica de cache na memória que armazena dados em pares de valor-chave usando memória física em vários servidores. O AppFabric fornece aprimoramentos de desempenho e escalabilidade para aplicativos .NET Framework. Conceitos e Arquitetura
fonte
Estendendo a resposta de @Hrvoje Hudo ...
Código:
Exemplos
Armazenamento em cache de item único (quando cada item é armazenado em cache com base em seu ID porque o armazenamento em cache de todo o catálogo para o tipo de item seria muito intenso).
Armazenando em cache tudo
Por que dizer
O segundo auxiliar é especialmente interessante porque a maioria das chaves de dados não é composta. Métodos adicionais podem ser adicionados se você usar chaves compostas frequentemente. Dessa forma, você evita fazer todos os tipos de concatenação ou sequência de caracteres. Formata para que a chave passe para o auxiliar de cache. Isso também facilita a passagem do método de acesso a dados, porque você não precisa passar o ID para o método wrapper ... tudo se torna muito conciso e consistente para a maioria dos casos de uso.
fonte
Aqui está uma melhoria na resposta de Hrvoje Hudo. Esta implementação possui algumas melhorias importantes:
Observe que isso depende da Newtonsoft.Json para serializar o objeto DependOn, mas que pode ser facilmente trocado por qualquer outro método de serialização.
ICache.cs
InMemoryCache.cs
Uso:
fonte
if (item == null)
deve estar dentro da fechadura. Agora, quando issoif
ocorre antes do bloqueio, a condição de corrida pode ocorrer. Ou melhor ainda, você deve manterif
antes do bloqueio, mas verifique novamente se o cache ainda está vazio como a primeira linha dentro do bloqueio. Porque se dois encadeamentos vierem ao mesmo tempo, ambos atualizarão o cache. Seu bloqueio atual não é útil.fonte
Eu usei dessa maneira e funciona para mim. https://msdn.microsoft.com/en-us/library/system.web.caching.cache.add(v=vs.110).aspx informações de parâmetros para system.web.caching.cache.add.
fonte
Eu uso duas classes. Primeiro, o objeto principal do cache:
O segundo é a lista de objetos de cache:
fonte
Eu direi que implementar o Singleton nessa questão persistente de dados pode ser uma solução para esse caso, caso você encontre soluções anteriores muito complicadas
fonte
fonte
Você também pode tentar usar o cache incorporado ao ASP MVC:
Adicione o seguinte atributo ao método do controlador que você deseja armazenar em cache:
Nesse caso, o ActionResult disso será armazenado em cache por 10 segundos.
Mais sobre isso aqui
fonte