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?

Boris Callens
quelle
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.

Matthew
quelle
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 :)

Andrei Rînea
quelle
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.

Gehackt
quelle
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")]
Nikki
quelle