HttpRuntime.Cache
obtient le Cache
pour l'application actuelle.
La MemoryCache
classe est similaire à la Cache
classe ASP.NET .
La MemoryCache
classe possède de nombreuses propriétés et méthodes pour accéder au cache qui vous seront familières si vous avez utilisé la Cache
classe ASP.NET .
La principale différence entre HttpRuntime.Cache
et MemoryCache
est que ce dernier a été modifié pour le rendre utilisable par les applications .NET Framework qui ne sont pas des applications ASP.NET.
Pour une lecture supplémentaire:
Mise à jour :
Selon les commentaires des utilisateurs, il arrive que le blog de Jon davis ne fonctionne pas, c'est pourquoi j'ai mis l'article en entier sous forme d'image.
Remarque: si ce n'est pas clair, cliquez simplement sur l'image, après quoi elle s'ouvrira sur un navigateur, puis cliquez à nouveau dessus pour zoomer :)
Voici l'article de Jon Davis. Pour préserver la lisibilité, je supprime la section EntLib désormais obsolète, l'intro ainsi que la conclusion.
Cache ASP.NET
ASP.NET ou l'assembly System.Web.dll dispose d'un mécanisme de mise en cache. Il n'a jamais été conçu pour être utilisé en dehors d'un contexte Web, mais il peut être utilisé en dehors du Web et il exécute tous les comportements d'expiration ci-dessus dans une sorte de table de hachage.
Après avoir parcouru Google, il semble que de nombreuses personnes qui ont discuté de la fonctionnalité de mise en cache intégrée dans .NET ont eu recours à l'utilisation du cache ASP.NET dans leurs projets non Web. Ce n'est plus le système de mise en cache intégré le plus disponible et le plus pris en charge dans .NET; .NET 4 a un ObjectCache que je reviendrai plus tard. Microsoft a toujours insisté sur le fait que le cache ASP.NET n'est pas destiné à être utilisé en dehors du Web. Mais beaucoup de gens sont toujours bloqués dans .NET 2.0 et .NET 3.5 et ont besoin de quelque chose avec lequel travailler, et cela fonctionne pour beaucoup de gens, même si MSDN dit clairement:
La classe du cache ASP.NET est System.Web.Caching.Cache dans System.Web.dll. Cependant, vous ne pouvez pas simplement créer un nouvel objet Cache. Vous devez l'acquérir à partir de System.Web.HttpRuntime.Cache.
L'utilisation du cache ASP.NET est documentée sur MSDN ici .
Avantages:
Les inconvénients:
ObjectCache / MemoryCache de .NET 4.0
Microsoft a finalement implémenté une classe ObjectCache abstraite dans la dernière version du .NET Framework et une implémentation de MemoryCache qui hérite et implémente ObjectCache à des fins en mémoire dans un paramètre non Web.
System.Runtime.Caching.ObjectCache se trouve dans l'assembly System.Runtime.Caching.dll. Il s'agit d'une classe abstraite qui déclare essentiellement les mêmes interfaces de style .NET 1.0 que celles trouvées dans le cache ASP.NET.
System.Runtime.Caching.MemoryCache
est l'implémentation en mémoire d'ObjectCache et est très similaire au cache ASP.NET, avec quelques modifications.Pour ajouter un élément avec une expiration glissante, votre code ressemblerait à ceci:
var config = new NameValueCollection(); var cache = new MemoryCache("myMemCache", config); cache.Add(new CacheItem("a", "b"), new CacheItemPolicy { Priority = CacheItemPriority.NotRemovable, SlidingExpiration=TimeSpan.FromMinutes(30) });
Avantages:
Contrairement au cache ASP.NET, vous pouvez instancier une instance d'objet MemoryCache.
Quelques légères améliorations ont été apportées par rapport à l'interface du cache ASP.NET, telles que la possibilité de s'abonner à des événements de suppression sans nécessairement être là lorsque les éléments ont été ajoutés, l'insertion redondante () a été supprimée, les éléments peuvent être ajoutés avec un CacheItem objet avec un initialiseur qui définit la stratégie de mise en cache, et Contains () a été ajouté.
Les inconvénients:
Bricolage: Construisez-vous vous-même
Il est en fait assez simple de créer un dictionnaire de mise en cache qui effectue une expiration explicite ou glissante. (Cela devient beaucoup plus difficile si vous voulez que les éléments soient supprimés automatiquement à des fins d'effacement de la mémoire.) Voici tout ce que vous avez à faire:
Microsoft doit prendre en charge ses conceptions originales car sa base d'utilisateurs a développé une dépendance à leur égard, mais cela ne signifie pas que ce sont de bonnes conceptions.
Avantages:
IDictionary<K,T>
. Cela le rend beaucoup plus facile à utiliser car son interface est plus prévisible en tant qu'interface de dictionnaire, et il le rend plus accessible aux assistants et aux méthodes d'extension qui fonctionnent avec IDictionary <>.Les inconvénients:
Parmi ces quatre options, c'est ma préférence. J'ai implémenté cette solution de mise en cache de base. Jusqu'à présent, cela semble fonctionner parfaitement, il n'y a pas de bogues connus (veuillez me contacter avec des commentaires ci-dessous ou à jon-at-jondavis s'il y en a !!), et j'ai l'intention de l'utiliser dans tous mes petits projets secondaires qui ont besoin mise en cache de base. C'est ici:
Lien Github: https://github.com/kroimon/ExpirableItemDictionary
Ancien lien: ExpirableItemDictionary.zip
Digne de mention: AppFabric, NoSQL, Et Al
Notez que le titre de cet article de blog indique «Simple Caching» et non «Heavy-Duty Caching». Si vous souhaitez vous lancer dans les activités lourdes, vous devriez envisager des solutions dédiées et évolutives.
la source
MemoryCache est ce qu'il dit, un cache stocké en mémoire
HttpRuntime.Cache (voir http://msdn.microsoft.com/en-us/library/system.web.httpruntime.cache(v=vs.100).aspx et http://msdn.microsoft.com/en- us / library / system.web.caching.cache.aspx ) persiste dans tout ce que vous configurez dans votre application.
voir par exemple «ASP.NET 4.0: Écriture de fournisseurs de cache de sortie personnalisés» http://weblogs.asp.net/gunnarpeipman/archive/2009/11/19/asp-net-4-0-writing-custom-output-cache -providers.aspx
la source
MemoryCache.Default peut également servir de "pont" si vous migrez une application ASP.NET MVC classique vers ASP.NET Core, car il n'y a pas de "System.Web.Caching" et "HttpRuntime" dans Core.
J'ai également écrit un petit benchmark pour stocker un
bool
élément 20000 fois (et un autre benchmark pour le récupérer) et MemoryCache semble être deux fois plus lent (27ms vs 13ms - c'est le total pour toutes les 20k itérations) mais ils sont tous les deux ultra-rapides et ceci peut probablement être ignoré.la source