12 votes

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

J'ai une application ASP.NET MVC 3 qui consiste essentiellement en un ensemble de services web. Ces services web sont exposés par un ensemble d'actions de contrôleur. Chaque action de contrôleur interroge ma base de données. Comme mes données changent rarement et que les données périmées ne sont pas un problème, j'ai pensé mettre en place un système de cache pour améliorer les performances. Mes objectifs sont les suivants :

  1. Ne jamais mettre en cache une réponse à un utilisateur.
  2. Mettre en cache les enregistrements de la base de données pendant un maximum de 24 heures. Si 24 heures se sont écoulées, consultez à nouveau la base de données.

Est-ce que cela a un sens ? Je sais comment empêcher la mise en cache de la réponse. J'utilise simplement ce qui suit :

HttpContext.Response.Cache.SetCacheability(cacheability)

Cependant, je ne sais pas comment mettre en mémoire cache les enregistrements de ma base de données pendant 24 heures. Quelqu'un a-t-il une idée de la façon de procéder ? Je ne sais même pas où chercher.

Merci.

8voto

Richard Points 8614

Vous pouvez utiliser le System.Runtime.Caching (ou le cache ASP.NET, mais celui-ci est plus ancien et ne peut être utilisé que dans les 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 paramètres de MemoryCache.Add pour contrôler la durée de la mise en cache, mais vous avez demandé 24h ci-dessus.

using System.Runtime.Caching;    // At top of file

public IEnumerable<MyDataObject> GetData() 
{
    IEnumerable<MyDataObject> data = MemoryCache.Default.Get(MYCACHEKEY) as IEnumerable<MyDataObject>;
    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 elles sont plutôt statiques, cette solution fera ce que vous avez demandé.

2voto

ken Points 6183

Le cadre MVC est indépendant de la persistance. Il n'y a pas de moyens intégrés pour stocker des données, donc il n'y a pas de moyens intégrés pour mettre en cache les données stockées.

El OutputCache peut être utilisé pour mettre en cache une réponse du serveur. Mais vous avez explicitement déclaré que ce n'est pas quelque chose que vous voulez faire.

Cependant, vous pouvez toujours utiliser les fonctions intégrées de la fonction OutputCache si vous souhaitez rester dans le cadre du MVC. Envisagez d'exposer les données que vous souhaitez mettre en cache sous la forme d'un résultat JSON.

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

La chaîne JSON à /ControllerName/GetMyData sera mis 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 devrez implémenter un appel AJAX sur votre page finale, ou effectuer un autre appel HTTP depuis votre serveur. Aucune de ces solutions n'est idéale.

Je chercherais une autre solution à votre problème en dehors du cadre MVC. Pensez à memcached qui a été créé exactement dans ce but.

2voto

Ce dont vous parlez n'est pas exactement une responsabilité MVC. ASP.Net vous permet de contrôler seulement les choses qu'il produit (et ce sont des réponses, évidemment).

Si vous voulez mettre des données en cache, il peut être préférable de les mettre en cache à l'endroit même où elles ont été produites - quelque part dans la couche BL ou la couche de données.

Vous pouvez faire quelque chose comme ça :

public class DataCacher
{
    private static String data;
    private static DateTime updateTime;

    private DataCacher() { }

    public static String 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;
        }
    }
}

String data présente vos données réelles ici. Après avoir ajouté cette classe, remplacez votre GetData() méthodes avec DataCacher.Data .

J'espère que cela vous aidera ou du moins vous amènera à réfléchir davantage.

1voto

Bond Points 2145

Si vous utilisez MSSQL, vous pouvez consulter le site suivant Dépendance du cache SQL .

Je ne suis pas sûr que vous puissiez configurer l'expiration du cache à 24 heures, mais avec la dépendance du cache, vous n'en aurez peut-être pas besoin - elle invalidera le cache dès qu'il y aura une mise à jour de la base de données (ce qui devrait être plus efficace que la stratégie d'expiration du temps).

0voto

mreyeros Points 2784

Ici est un bon article qui traite de plusieurs pratiques liées à la performance pour ASP.NET MVC 3 et la mise en cache est mentionnée.

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