Caching in asp.net-mvc


82

Ich möchte meine datenbankintensivsten Aktionen auf meiner asp.net-mvc-Site zwischenspeichern. In meiner Forschung habe ich gefunden

  • Donut-Caching auf Phils Blog
  • Filter zwischenspeichern / komprimieren in Kazis Blog
  • Scott Hanslemans Podcast darüber, wie sie Dinge in SO zwischengespeichert haben.

Aber ich habe noch nicht das Gefühl, dass ich es verstehe.
Ich möchte meine POST-Anfrage abhängig von mehreren Pars zwischenspeichern können. Diese Pars befinden sich in einem Objekt. Daher möchte ich das Ergebnis der folgenden Anfrage zwischenspeichern:

public ActionResult AdvancedSearch(SearchBag searchBag)

Wobei searchBag ein Objekt ist, das (eine Reihe) optionaler Suchparameter enthält. Meine Ansichten selbst sind leicht (wie sie sein sollten), aber der Datenzugriff kann ziemlich zeitaufwändig sein, abhängig davon, welche Felder in der Suchtasche ausgefüllt sind.

Ich habe das Gefühl, ich sollte eher auf meiner Datenschicht als auf meinen Handlungen zwischenspeichern.
Wie soll ich VaryByParam im OutputCache-Attribut verwenden?


2
Haben Sie es mit VaryByParam = "searchBag.property" versucht?
Eduardo Campañó

Nein, habe ich nicht. Ich werde versuchen, was du sagst. Aber wie wäre es mit der Aufzählung mehrerer Parameter?
Boris Callens

2
VaryByParam = "firstParam; secondParam; ThirdParam"
Arnis Lapsa

1
Etwas spät, aber der Enterprise Library Caching-Anwendungsblock ist in .Net 4.0 enthalten, sodass Sie jetzt den MemoryCache von System.Runtime.Caching für einen ähnlichen Effekt verwenden können. Überall auch :)
Carl

Antworten:


74

Ich mag es auch, im Modell oder in der Datenschicht zwischenzuspeichern. Dies isoliert alles, was mit dem Abrufen von Daten von der Steuerung / Präsentation zu tun hat. Sie können über die Unternehmensbibliothek auf den ASP.NET-Cache zugreifen System.Web.HttpContext.Current.Cacheoder den Caching-Anwendungsblock verwenden. Erstellen Sie Ihren Schlüssel für die zwischengespeicherten Daten aus den Parametern für die Abfrage. Stellen Sie sicher, dass der Cache ungültig wird, wenn Sie die Daten aktualisieren.


1
Ich sollte mich über die Enterprise Library informieren, denke ich. Da der größte Teil der Verzögerung auf der Datenschicht liegt, denke ich, dass dies am Ende die beste Lösung sein wird. Derzeit ist es eine schreibgeschützte Datenbank, was das Problem mit veralteten Objekten erhöht :)
Boris Callens

17
Der Caching-App-Block scheint ein ganzes Durcheinander von Overkills zu sein. Ich habe festgestellt, dass HttpRuntime.Cache in fast allen Fällen mehr als ausreichend ist.
Jeff Putz

3
Warum übertrieben? Ich bin jetzt viel weiter in der Entwicklung und habe festgestellt, dass das Cache-System der EL sehr einfach zu bedienen ist. Verweisen Sie auf die richtige Bibliothek, fügen Sie die richtigen Konfigurationszeilen hinzu, und Sie können mit dem Zwischenspeichern und Abrufen von Objekten mit jeweils einer Codezeile beginnen.
Boris Callens

6
Ich denke, es ist der Schritt "die richtigen Konfigurationszeilen hinzufügen", der einige Leute irritiert.
Mike Chamberlain

Es wäre gut, wenn Sie auch erklären könnten, wie der Speichercache ungültig wird, wenn die Datenbank aktualisiert wird. Verwenden Sie einen Dienst, um häufig zu überprüfen, und wie Sie dann den Cache leeren?
Shaijut

66

Oder Sie können unabhängig vom HttpContext.Current sein und über HttpRuntime.Cache auf den Cache zugreifen :)


Dies bedeutet auch, dass Sie weiterhin auf den 'Cache' zugreifen können, wenn Code in einem Hintergrundthread ausgeführt wird (dh asynchron / auf Güte warten).
Michael K. Campbell

12

OutputCaching ist häufig das schnellste und effizienteste, jedoch nur dann, wenn es Ihren Anforderungen entspricht. Es macht keinen Sinn, schnell effizient zu sein, wenn es falsch ist! ;)

In diesem Fall scheint das Caching auf der Datenebene korrekt zu sein, da Sie komplexe Caching-Anforderungen haben. Manchmal können Sie beide kombinieren, wenn der Parametersatz, der steuert, welche Ausgabe zwischengespeichert wird, einfach ist.


0

Sie können das Ausgabe-Caching wie folgt verwenden

[OutputCache(Duration = 10, VaryByParam = "empID")]
      public ActionResult GetEmployeeDetail(int empID)
      {
          Employee e = new Employee();
          return Content(e.getEmployeeDetails(empID));
      }

oder Sie können Cache-Profile verwenden, die in der Webkonfiguration festgelegt wurden

<caching>
<outputCacheSettings>
    <outputCacheProfiles>
        <add name="Admin" 

        duration="86420" varyByParam="none"/>
    </outputCacheProfiles>
</outputCacheSettings>
</caching>

and use this tag
[OutputCache(CacheProfile="Admin")]
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.