it-swarm-pt.tech

Cache em C #/.net

Eu queria perguntar-lhe qual é a melhor abordagem para implementar um cache em c #? Existe uma possibilidade usando determinadas classes .NET ou algo assim? Talvez algo como um dicionário que irá remover algumas entradas, se ficar muito grande, mas onde as entradas de quem não serão removidas pelo coletor de lixo?

29
Sebastian Müller

Se você estiver usando o ASP.NET, poderá usar a classe Cache (System.Web.Caching).

Aqui está uma boa classe auxiliar: c-cache-helper-class

Se você quer dizer cache em um aplicativo de formulário do Windows, isso depende do que você está tentando fazer e de onde você está tentando armazenar os dados em cache.

Nós implementamos um cache atrás de um Webservice para certos métodos
(usando o objeto System.Web.Caching).

No entanto, você também pode querer examinar o Caching Application Block. ( Veja aqui) que faz parte da Enterprise Library for .NET Framework 2.0.

15
Bravax

Se você estiver usando o .NET 4 ou superior, você pode usar MemoryCache class.

26
Muaddib
2
Yaeiou2k

MemoryCache no framework é um bom lugar para começar, mas você também pode gostar de considerar a biblioteca de código aberto LazyCache porque tem uma API mais simples que o cache de memória e possui bloqueio embutido, assim como outros recursos amigáveis ​​do desenvolvedor. Também está disponível no nuget. 

Para dar um exemplo:

// Create our cache service using the defaults (Dependency injection ready).
// Uses MemoryCache.Default as default so cache is shared between instances
IAppCache cache = new CachingService();

// Declare (but don't execute) a func/delegate whose result we want to cache
Func<ComplexObjects> complexObjectFactory = () => methodThatTakesTimeOrResources();

// Get our ComplexObjects from the cache, or build them in the factory func 
// and cache the results for next time under the given key
ComplexObject cachedResults = cache.GetOrAdd("uniqueKey", complexObjectFactory);

Eu escrevi recentemente este artigo sobre começando com o cache em dot net que você pode achar útil.

(Aviso: Eu sou o autor do LazyCache)

1
alastairtree
1
Olivier Albertini

As classes de cache fornecidas com o .NET são úteis, mas têm um grande problema - elas não podem armazenar muitos dados (dezenas de milhões +) de objetos por um longo tempo sem matar seu GC. Eles funcionam muito bem se você armazenar em cache alguns milhares de objetos, mas no momento em que você migra para milhões e os mantém até se propagar para GEN2 - as pausas do GC acabariam por se tornar notadas quando o sistema chega ao limite de pouca memória e o GC precisa varrer todas as gens.

A praticidade é esta - se você precisa armazenar algumas centenas de milhares de instâncias - use o cache do MS. Não importa se seus objetos são de 2 campos ou 25 de campo - é sobre o número de referências.

Por outro lado, há casos em que grandes RAMs, que são comuns hoje em dia, precisam ser utilizadas, ou seja, 64 GB. Para isso, criamos um gerenciador de memória e um cache 100% gerenciados que ficam em cima dele. . 

Nossa solução pode armazenar facilmente 300.000.000 de objetos em memória em processo sem sobrecarregar a GC - isso é porque armazenamos dados em segmentos grandes (250 mb) byte [].

Aqui está o código: NFX Pile (Apache 2.0)

E vídeo: NFX Pile Cache - Youtube

1
itadapter DKh

Sua pergunta precisa de mais esclarecimentos. C # é uma linguagem não um framework. Você precisa especificar qual estrutura deseja implementar o armazenamento em cache. Se considerarmos que você deseja implementá-lo no ASP.NET, ele ainda depende completamente do que você deseja do Cache. Você pode decidir entre o cache em processo (que manterá os dados dentro do heap de seu aplicativo) e o cache fora de processo (nesse caso, você pode armazenar os dados em outra memória além do heap, como o servidor de cache do Amazon Elastic). E há também outra decisão a ser feita entre o cache do cliente ou o cache do lado do servidor. Geralmente em solução você tem que desenvolver uma solução diferente para armazenar dados diferentes em cache. Como base em quatro fatores (acessibilidade, persistência, tamanho, custo), você precisa decidir qual solução é necessária. 

0
Meysam