L'utilisation de plusieurs instances de MemoryCache
J'aimerais ajouter des capacités de mise en cache de mon application en utilisant le System.Runtime.Caching
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 en utilisant 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?
- Quelle est la différence entre un simple cache et de nombreuses caches? Après tout, ils vont tous faire la même chose.
- D'une part, je n'aurez pas à vous soucier de la clé de collisions autant. Aussi, je crois que c'est plus organisé et plus facile à corriger que d'avoir un objet qui contient tout ce que l'application des caches.
- Cela signifie que vous ne devez pas créer de nombreuses caches qui ne cache la même chose. Il est beaucoup mieux d'cache autant que possible par une centrale de cache. Mais il est parfaitement ok pour créer de nombreuses caches qui ne cache différentes choses.
- Si vous êtes intéressé par un cache distribué, vous pourriez en apprendre sur le Windows de la Version en Cache. Vient de Gagner 2008 et offre un plus puissant système de cache qui exploite des serveurs externes. Voici un article à ce sujet hanselman.com/blog/...
- Je me sers de plusieurs de trop. Généralement, un par type. Ce serait merveilleux si la documentation qui a dit "tu devrais..." dis "tu devrais... parce que...".
- Aussi, parfois, j'ai envie d'effacer la cache d'un contexte spécifique, mais pas les autres, ce qui serait beaucoup plus facile si le contexte avait dédié cache (c'est comment je me suis retrouvé à cette question de toute façon!)
- #WhenYouWantSomethingThatYouAssumedwaseasybuttheymakeithardandthenpeopleseemtohavenocluewhyyouwantit
- Je suppose que le cadre n'est pas toujours de tout. LazyCache semble prometteur : hanselman.com/blog/...
Vous devez vous connecter pour publier un commentaire.
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.
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.
Que la mémoire-limite, le pool d'applications de recycler, de perdre caches chose est un "talon d'Achille" 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ère que ça aide!
MemoryCache
de sorte que vous n'avez pas besoin de ces forcé "namespaces" touches et vous pouvez lancer une requête sur le nombre d'éléments mis en cache dans toute la Région. Mais ce n'est pas actuellement pris en charge pour les non-cache web de mise en œuvre. 🙁 En attendant, on dirait que vous connaissez vos limites et sont ok avec eux.- Je utiliser plusieurs de trop. Généralement, un par type.
À la recherche à la
MemoryCache
je vois que ça s'accroche dansAppDomain
événements et maintient les compteurs de performance. Je soupçonne puis, il y a une surcharge de vue des ressources en utilisant plus d'un (par exemple CPU, de compteurs et de la mémoire) et c'est pourquoi il est découragé.