J'ai lu beaucoup d'informations sur la mise en cache des pages et la mise en cache des pages partielle dans une application MVC. Cependant, j'aimerais savoir comment vous mettriez en cache les données.
Dans mon scénario, j'utiliserai LINQ to Entities (framework d'entité). Lors du premier appel à GetNames (ou quelle que soit la méthode), je veux récupérer les données de la base de données. Je veux enregistrer les résultats dans le cache et au deuxième appel pour utiliser la version mise en cache si elle existe.
Quelqu'un peut-il montrer un exemple de la façon dont cela fonctionnerait, où cela devrait être mis en œuvre (modèle?) Et si cela fonctionnerait.
J'ai vu cela dans des applications ASP.NET traditionnelles, généralement pour des données très statiques.
la source
Réponses:
Référencez la DLL System.Web dans votre modèle et utilisez System.Web.Caching.Cache
Un peu simplifié mais je suppose que ça marcherait. Ce n'est pas spécifique à MVC et j'ai toujours utilisé cette méthode pour mettre les données en cache.
la source
DB.GetNames().AsQueryable
méthode de retard de la requête?Voici une classe / service d'aide au cache agréable et simple que j'utilise:
Usage:
Le fournisseur de cache vérifiera s'il y a quelque chose par le nom de "id de cache" dans le cache, et s'il n'y en a pas, il appellera une méthode déléguée pour récupérer les données et les stocker dans le cache.
Exemple:
la source
Je fais référence au post de TT et suggère l'approche suivante:
Référencez la DLL System.Web dans votre modèle et utilisez System.Web.Caching.Cache
Vous ne devez pas retourner une valeur relue depuis le cache, car vous ne saurez jamais si à ce moment précis, elle est toujours dans le cache. Même si vous l'avez inséré dans la déclaration précédente, il est peut-être déjà parti ou n'a jamais été ajouté au cache - vous ne le savez tout simplement pas.
Vous ajoutez donc les données lues à partir de la base de données et les renvoyez directement, sans relire à partir du cache.
la source
Cache["names"] = noms;
mise dans le cache?Pour le framework .NET 4.5+
ajouter une référence:
System.Runtime.Caching
ajouter en utilisant l'instruction:
using System.Runtime.Caching;
Plus d'informations:
https://msdn.microsoft.com/en-us/library/dd997357(v=vs.110).aspx
https://docs.microsoft.com/en-us/dotnet/framework/performance/caching-in-net-framework-applications
la source
Db.GerNames()
vient-il?Steve Smith a fait deux excellents articles de blog qui montrent comment utiliser son modèle CachedRepository dans ASP.NET MVC. Il utilise efficacement le modèle de référentiel et vous permet d'obtenir la mise en cache sans avoir à modifier votre code existant.
http://ardalis.com/Introducing-the-CachedRepository-Pattern
http://ardalis.com/building-a-cachedrepository-via-strategy-pattern
Dans ces deux articles, il vous montre comment configurer ce modèle et explique également pourquoi il est utile. En utilisant ce modèle, vous obtenez la mise en cache sans que votre code existant ne voit la logique de mise en cache. Essentiellement, vous utilisez le référentiel mis en cache comme s'il s'agissait d'un autre référentiel.
la source
AppFabric Caching est distribué et une technique de mise en cache en mémoire qui stocke les données dans des paires clé-valeur en utilisant la mémoire physique sur plusieurs serveurs. AppFabric fournit des améliorations de performances et d'évolutivité pour les applications .NET Framework. Concepts et architecture
la source
Prolonger la réponse de @Hrvoje Hudo ...
Code:
Exemples
Mise en cache d'un seul élément (lorsque chaque élément est mis en cache en fonction de son ID, car la mise en cache de l'ensemble du catalogue pour le type d'élément serait trop intensive).
Mettre tout en cache
Pourquoi TId
Le deuxième assistant est particulièrement agréable car la plupart des clés de données ne sont pas composites. Des méthodes supplémentaires pourraient être ajoutées si vous utilisez souvent des clés composites. De cette façon, vous évitez de faire toutes sortes de concaténation de chaînes ou de string.Formats pour obtenir la clé à passer à l'assistant de cache. Cela facilite également le passage de la méthode d'accès aux données car vous n'avez pas à passer l'ID dans la méthode wrapper ... le tout devient très concis et cohérent pour la majorité des cas d'utilisation.
la source
Voici une amélioration de la réponse de Hrvoje Hudo. Cette implémentation présente quelques améliorations clés:
Notez que cela a une dépendance sur Newtonsoft.Json pour sérialiser l'objet dependOn, mais qui peut être facilement remplacé par toute autre méthode de sérialisation.
ICache.cs
InMemoryCache.cs
Usage:
la source
if (item == null)
devrait être à l'intérieur de la serrure. Maintenant, lorsqueif
c'est avant le verrouillage, des conditions de concurrence peuvent se produire. Ou encore mieux, vous devez conserverif
avant le verrou, mais vérifiez à nouveau si le cache est toujours vide comme première ligne à l'intérieur du verrou. Parce que si deux threads arrivent en même temps, ils mettent tous les deux à jour le cache. Votre verrou actuel n'est pas utile.la source
Je l'ai utilisé de cette façon et cela fonctionne pour moi. https://msdn.microsoft.com/en-us/library/system.web.caching.cache.add(v=vs.110).aspx informations sur les paramètres pour system.web.caching.cache.add.
la source
J'utilise deux classes. Tout d'abord, l'objet principal du cache:
La seconde est la liste des objets de cache:
la source
Je dirai que la mise en œuvre de Singleton sur ce problème de données persistant peut être une solution à ce problème au cas où vous trouveriez des solutions précédentes beaucoup plus compliquées.
la source
la source
Vous pouvez également essayer d'utiliser la mise en cache intégrée à ASP MVC:
Ajoutez l'attribut suivant à la méthode de contrôleur que vous souhaitez mettre en cache:
Dans ce cas, l'ActionResult sera mis en cache pendant 10 secondes.
Plus à ce sujet ici
la source