web-dev-qa-db-fra.com

Mise en cache dans C #/.Net

Je voulais vous demander quelle est la meilleure approche pour implémenter une mémoire cache en C #? Existe-t-il une possibilité d'utiliser des classes .NET données ou quelque chose du genre? Peut-être quelque chose comme un dictionnaire qui supprimera certaines entrées, s'il devient trop volumineux, mais où les entrées ne seront pas supprimées par le ramasse-miettes?

29
Sebastian Müller

Si vous utilisez ASP.NET, vous pouvez utiliser la classe Cache (System.Web.Caching).

Voici une bonne classe d'assistance: c-cache-helper-class

Si vous voulez parler de la mise en cache dans une application Windows Form, cela dépend de ce que vous essayez de faire et de l'endroit où vous essayez de mettre les données en cache.

Nous avons implémenté un cache derrière un Webservice pour certaines méthodes
(en utilisant l'objet System.Web.Caching.).

Toutefois, vous pouvez également consulter le bloc d’application de mise en cache. ( Voir ici) qui fait partie de la bibliothèque d'entreprise pour .NET Framework 2.0.

15
Bravax

Si vous utilisez .NET 4 ou une version supérieure, vous pouvez utiliser MemoryCache class.

26
Muaddib
2
Yaeiou2k

MemoryCache dans le cadre est un bon point de départ, mais vous pouvez également envisager la bibliothèque open source LazyCache car elle possède une API plus simple que la mémoire cache et comporte un verrouillage intégré ainsi que d'autres fonctionnalités conviviales pour les développeurs. Il est également disponible sur les pépites. 

Pour vous donner un exemple:

// 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);

J'ai récemment écrit cet article à propos de comment démarrer avec la mise en cache dans Dot Net que vous pourrez trouver utile.

(Avertissement: je suis l'auteur de LazyCache)

1
alastairtree
1
Olivier Albertini

Les classes de cache fournies avec .NET sont pratiques, mais posent un problème majeur: elles ne peuvent pas stocker beaucoup de données (plusieurs dizaines de millions) d'objets pendant une longue période sans tuer votre CPG. Ils fonctionnent très bien si vous cachez quelques milliers d'objets, mais dès que vous en stockez des millions et que vous les conservez jusqu'à ce qu'ils se propagent dans GEN2 - les pauses GC commencent à être perceptibles lorsque le système atteint un seuil de mémoire faible et que le GC doit balayer tous les gens.

En pratique, si vous devez stocker quelques centaines de milliers d'instances, utilisez le cache MS. Peu importe si vos objets sont à 2 ou 25 champs - cela concerne le nombre de références.

D’autre part, il est parfois nécessaire d’utiliser des mémoires RAM volumineuses, ce qui est courant de nos jours, c’est-à-dire 64 Go . Pour cela, nous avons créé un gestionnaire de mémoire 100% gérée et un cache s’y superposant. 

Notre solution peut facilement stocker 300 000 000 d'objets en mémoire en cours de processus sans aucune charge pour le GC. En effet, nous stockons des données dans de grands segments d'octets [] (250 mb).

Voici le code: Pile NFX (Apache 2.0)

Et la vidéo: Cache de piles NFX - Youtube

1
itadapter DKh

Votre question nécessite plus de clarification. C # est un langage, pas un cadre. Vous devez spécifier quel framework vous souhaitez implémenter la mise en cache. Si nous considérons que vous souhaitez l'implémenter dans ASP.NET, cela dépend encore complètement de ce que vous voulez dans le cache. Vous pouvez choisir entre le cache in-process (qui conservera les données dans le segment de mémoire de votre application) et le cache en-dehors du processus (dans ce cas, vous pouvez stocker les données dans une mémoire autre que celle du segment, comme le serveur de cache Amazon Elastic). Et il faut également prendre une autre décision entre la mise en cache client ou la mise en cache côté service. Généralement, en solution, vous devez développer différentes solutions pour la mise en cache de différentes données. En vous basant sur quatre facteurs (accessibilité, persistance, taille, coût), vous devez décider de la solution dont vous avez besoin. 

0
Meysam