Mise en cache des données dans ASP.NET MVC 3

J’ai une application ASP.NET MVC 3 qui n’est en fait qu’un ensemble de services Web. Ces services Web sont exposés par un ensemble d’actions du contrôleur. Chaque action du contrôleur interroge ma firebase database. Parce que mes données changent rarement et que les données obsolètes ne sont pas un problème, j’ai pensé implémenter une mise en cache pour améliorer les performances. Mes objectives sont:

  1. Ne jamais mettre en cache une réponse à un utilisateur.
  2. Mettez en cache les enregistrements de la firebase database pendant 24 heures maximum. Si 24 heures se sont écastings, appuyez à nouveau sur la firebase database.

Cela a-t-il du sens? Je sais comment empêcher la réponse de la mise en cache. Je viens d’utiliser ce qui suit:

HttpContext.Response.Cache.SetCacheability(cacheability) 

Cependant, je ne sais pas comment mettre en cache mes enregistrements de firebase database pendant 24 heures maximum. Quelqu’un a-t-il des suggestions sur la façon de procéder? Je ne sais même pas où regarder.

Je vous remercie

Vous pouvez utiliser l’espace de noms System.Runtime.Caching (ou le cache ASP.NET, mais il est plus ancien et ne peut être utilisé que dans des applications Web).

Voici un exemple de fonction que vous pouvez utiliser pour envelopper votre mécanisme actuel de récupération de données. Vous pouvez modifier les parameters dans MemoryCache.Add pour contrôler la quantité de mémoire cache, mais vous avez demandé 24h ci-dessus.

 using System.Runtime.Caching; // At top of file public IEnumerable GetData() { IEnumerable data = MemoryCache.Default.Get(MYCACHEKEY) as IEnumerable; if (data == null) { data = // actually get your data from the database here MemoryCache.Default.Add(MYCACHEKEY, data, DateTimeOffset.Now.AddHours(24)); } return data; } 

Comme mentionné par @Bond, vous pouvez également envisager d’utiliser une dépendance de cache SQL si les données que vous mettez en cache sont susceptibles de changer dans les 24 heures. Si c’est assez statique cependant, cela fera ce que vous avez demandé.

Le framework MVC est agnostique de persistance. Il n’y a pas de moyen intégré pour stocker des données, donc il n’y a pas de moyen intégré pour mettre en cache les données stockées.

L’atsortingbut OutputCache peut être utilisé pour mettre en cache une réponse du serveur. Mais vous avez explicitement déclaré que vous ne souhaitiez pas le faire.

Cependant, vous pourrez peut-être toujours utiliser le OutputCache si vous souhaitez restr dans la structure MVC. Envisagez d’exposer les données que vous souhaitez mettre en cache en tant que résultat JSON.

 [OutputCache(Duration = 86400)] public JsonResult GetMyData() { var results = QueryResults(); return Json(results); } 

La chaîne JSON dans /ControllerName/GetMyData sera mise en cache pendant 24 heures, de sorte que la requête réelle ne sera exécutée qu’une fois par jour. Cela signifie que vous devez implémenter un appel AJAX sur votre dernière page ou passer un autre appel HTTP à partir de votre serveur. Aucune de celles-ci n’est idéale.

Je rechercherais une autre solution à votre problème en dehors du cadre MVC. Considérez memcached , qui a été créé exactement à cette fin.

Ce dont vous parlez n’est pas exactement la responsabilité de MVC. ASP.Net vous permet de n’accéder qu’à ce qu’il produit (et ce sont des réponses claires, bien sûr).

Si vous souhaitez mettre en cache des données, il peut être préférable de les mettre en cache au même endroit où elles ont été produites, quelque part dans BL ou Data Layer.

Vous pouvez faire quelque chose comme ça:

 public class DataCacher { private static Ssortingng data; private static DateTime updateTime; private DataCacher() { } public static Ssortingng Data { get { if (data == null || updateTime > DateTime.Now) { data = "Insert method that requests your data form DB here: GetData()"; updateTime = DateTime.Now.AddDays(1); } return data; } } } 

Ssortingng data présentent vos données réelles ici. Après avoir ajouté cette classe, remplacez vos méthodes GetData() par DataCacher.Data .

J’espère que cela vous aidera ou au moins vous mènera à une reflection plus approfondie.

Si vous utilisez MSSQL, vous voudrez peut-être examiner la dépendance de cache SQL .

Je ne sais pas si vous pouvez configurer l’expiration du cache sur 24 heures, mais avec la dépendance du cache, vous n’aurez peut-être pas besoin de le faire. Le cache sera invalidé dès qu’une mise à jour de la firebase database sera mise à jour (c.-à-d. Devrait être plus efficace que l’expiration du temps. stratégie).

Voici un bon article qui traite de plusieurs pratiques liées aux performances pour ASP.NET MVC 3 et à la mise en cache.