76 votes

Utilisation de plusieurs instances de MemoryCache

J'aimerais ajouter des capacités de mise en cache de mon application en utilisant l' System.Runtime.Caching d'espace de noms, et aurait probablement besoin d'utiliser la mise en cache dans plusieurs endroits et dans différents contextes. Pour ce faire, je veux utiliser plusieurs MemoryCache instances.

Cependant, je vois ici que l'utilisation de plus d'une instance de MemoryCache est déconseillé:

MemoryCache n'est pas un singleton, mais vous ne devez pas créer un peu ou potentiellement un seul MemoryCache instance et le code qui met en cache les articles doivent utiliser ces instances.

Comment plusieurs MemoryCache cas nuire à ma demande? Je trouve cela un peu bizarre parce que il me semble que l'utilisation de plusieurs caches dans une application est un joli scénario commun.

EDIT: Plus précisément, j'ai une classe qui doit garder un cache pour chaque instance. Devrais-je éviter d'utiliser des MemoryCache et chercher une autre solution de mise en cache? Est l'aide de MemoryCache dans cette situation considérée comme mauvaise, et si oui, pourquoi?

79voto

BenSwayne Points 10621

Je suis récemment allé par moi-même ainsi. L'examen d'une mémoire cache sera de processus spécifiques (pas partagée entre plusieurs instances d'un site web ou natif application d'entreprise ou de plusieurs serveurs) il n'y a vraiment aucun avantage à avoir de multiples MemoryCache cas de figure, sauf pour le code des raisons d'organisation (qui peut être obtenue par d'autres moyens).

La Mémoire cache est destiné à être utilisé seul pour la plupart en raison de sa gestion de la mémoire des capacités. En plus de les compteurs de performance (qui n'ont que des frais généraux) la MemoryCache est également en mesure d'expiration des articles quand il est à court de mémoire allouée.

Si l'instance actuelle du cache dépasse la limite de la mémoire par la CacheMemoryLimit de la propriété, le cache de la mise en œuvre supprime les entrées du cache. Chaque instance de cache de l'application peut utiliser le quantité de mémoire qui est spécifié par le CacheMemoryLimit de la propriété.

de MemoryCache.CacheMemoryLimit Propriété

En utilisant une seule instance de la MemoryCache elle peut s'appliquer à cette gestion de la mémoire de manière efficace l'ensemble de l'application exemple. Expirant le moins important, les éléments de l'ensemble de l'application. Cela permet de maximiser l'utilisation de la mémoire, sans dépasser vos capacités matérielles. En limitant la portée de tout un MemoryCache (comme pour une instance d'une classe), il ne peut plus gérer efficacement la mémoire de votre application (comme il ne peut pas "voir" le tout). Si toutes ces cache était "occupé" vous pouvez avoir un moment plus difficile la gestion de la mémoire et il ne sera jamais à être presque aussi efficace.

Ceci est particulièrement sensible dans les applications qui n'ont pas le luxe d'un serveur dédié. Imaginez que vous êtes l'exécution de votre application sur un serveur partagé, où vous avez seulement été alloué 150 mo de RAM (commun à bas prix de 10 $/mois hébergement), vous devez compter sur votre cache pour l'utiliser au max, sans le dépasser. Si vous dépassez cette utilisation de la mémoire de votre application de la piscine sera recyclé et votre application perd tous en mémoire les caches! (commune hébergement pas cher de pratique), La même chose pourrait s'appliquer à un non-application web hébergée dans la maison sur certains serveur d'entreprise. Même chose, vous avez dit de ne pas le porc toute la mémoire sur cette machine et à coexister pacifiquement avec d'autres applications professionnelles.

Cette mémoire-limite, le pool d'applications de recycler, de perdre caches chose est une commune "Achille guérir" les applications web. Lorsque les applications sont leur plus forte, ils réinitialiser le plus souvent due à un dépassement des allocations de mémoire, de perdre toutes les entrées du cache et à cet effet, de faire la plupart des travaux de ré-extraction des trucs qui auraient dû être mis en cache dans la première place. Sens de l'application perd le rendement à charge max. au lieu de gagner.

Je sais MemoryCache est la non-web version spécifique du Système.Web.La mise en cache.Cache de mise en œuvre, mais cela illustre la logique derrière le cache de mise en œuvre. La même logique peut s'appliquer à un non-projet web si vous n'avez pas exclusive d'utilisation du matériel informatique. Rappelez-vous, si votre cache les forces de la machine pour commencer à faire de fichier d'échange d'swaps alors votre cache est plus rapide que la mise en cache sur le disque. Vous aurez toujours besoin d'une limite quelque part, même si la limite est de 2 go ou quelque chose.

Dans mon cas, après avoir lu à ce sujet, je suis passé à l'aide d'un "public static MemoryCache" dans mon application et je l'ai simplement mise en cache des éléments distincts par leurs clés de cache. Par exemple, si vous souhaitez mettre en cache par exemple, vous pourriez avoir une clé de cache comme quelque chose comme "instance-{instanceId}-resourceName-{resourceId}". Il pense que le nom de l'espacement de vos entrées de cache.

Espérons que ça aide!

6voto

Kit Points 4632

J'en utilise plusieurs aussi. Généralement un par type.

En regardant les MemoryCache je vois qu’il s’accroche à des événements AppDomain et maintient des compteurs de performance. J'imagine que l'utilisation de plusieurs ressources (par exemple, le processeur, les compteurs et la mémoire) peut entraîner une surcharge des ressources, ce qui explique pourquoi cela est découragé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X