Was ist der Zweck von MemoryCache in MVC?

8

Ich bin bei der richtigen Verwendung von MemoryCache etwas verwirrt.

Soll / kann es verwendet werden, um statische Informationen zu laden, um bei wiederholten Anrufen zu speichern? Sollte / kann es verwendet werden, um Daten in einer Sicht über mehrere Aktionsmethoden zu erhalten?

Ich habe eine Instanz, bei der ich den Datenspeicher nicht verwenden möchte, um die Daten in meiner Ansicht zu füllen und zu persistieren. Ich habe angefangen, den MemoryCache zu verwenden, der gut funktioniert, aber ich fange an zu fragen, ob das der richtige Ansatz war.

Was passiert, wenn ich mehrere Benutzer auf derselben Seite habe, die denselben MemoryCache verwenden?

    
John Doe 15.04.2016, 12:13
quelle

1 Antwort

20

Zuerst MemoryCache ist Teil des Namensraums System.Runtime.Caching . Es kann von MVC-Anwendungen verwendet werden, ist jedoch nicht auf MVC-Anwendungen beschränkt.

  

HINWEIS: Es gibt auch einen System.Web.Caching -Namespace (viel älter), der nur mit dem ASP.NET-Framework (einschließlich MVC) verwendet werden kann.

  

Soll / kann es verwendet werden, um statische Informationen zu laden, um bei wiederholten Anrufen zu speichern?

Ja.

  

Soll / kann es verwendet werden, um Daten in einer Ansicht über mehrere Aktionsmethoden zu erhalten?

Ja. Wenn Ihre Ansichten die gleichen Daten verwenden, können sie dies tun. Oder wenn Sie Daten haben, die sich auf Ihrer _Layout.cshtml -Seite befinden, die zwischengespeichert werden muss, könnte dies in einem globaler Filter .

  

Was passiert, wenn mehrere Benutzer auf derselben Seite denselben MemoryCache verwenden?

Caching wird standardmäßig zwischen allen Benutzern geteilt. Es ist speziell dafür gedacht, Daten im Speicher zu halten, damit sie nicht bei jeder Anfrage aus der Datenbank geholt werden müssen (z. B. eine Liste von Statusnamen auf einer Checkout-Seite zum Auffüllen eines Dropdown-Menüs für alle Benutzer).

Es ist auch eine gute Idee, Daten, die sich häufig für ein oder zwei Sekunden ändern, zwischenzuspeichern, um zu verhindern, dass eine Flut gleichzeitiger Anfragen eine Denial-of-Service-Attacke auf Ihre Datenbank darstellt.

Caching hängt von einem eindeutigen Schlüssel ab. Es ist möglich, einzelne Benutzerinformationen im Cache zu speichern, indem Sie den Namen oder die ID des Benutzers als Teil des Schlüssels angeben.

%Vor%
  

Warnung: Diese Methode funktioniert nur, wenn Sie einen einzelnen Webserver haben. Es wird nicht auf mehrere Webserver skaliert. Der Sitzungsstatus (der für den individuellen Benutzerspeicher gedacht ist) ist ein besser skalierbarer Ansatz. Der Sitzungsstatus ist jedoch nicht immer Kompromisse wert.

Typisches Caching-Muster

Beachten Sie, dass, obwohl MemoryCache threadsicher ist, die Verwendung der Operation in Verbindung mit einem Datenbankaufruf die Operation über Threads führen kann. Ohne Sperren können möglicherweise mehrere Abfragen an die Datenbank gesendet werden, um den Cache nach Ablauf erneut zu laden.

Sie sollten also ein doppelt geprüftes Sperrmuster verwenden, um sicherzustellen, dass nur ein Thread das erneute Laden durchläuft der Cache von der Datenbank.

Nehmen wir an, Sie haben eine Liste, die verschwenderisch ist, um jede Anfrage zu beantworten, weil jeder Benutzer die Liste benötigt, wenn er auf eine bestimmte Seite gelangt.

%Vor%

Um das Ergebnis dieser Abfrage zwischenzuspeichern, können Sie eine andere Methode mit einem doppelt überprüften Sperrmuster hinzufügen und damit Ihre ursprüngliche Methode aufrufen.

  

HINWEIS: Ein gängiger Ansatz besteht darin, das Dekorationsmuster zu verwenden, um das Caching nahtlos für Sie zu gestalten API.

%Vor%

Sie rufen also GetCachedStateOrProvinceList auf und es wird automatisch die Liste aus dem Cache abgerufen, und wenn es nicht zwischengespeichert wird, wird die Liste automatisch aus der Datenbank in den Cache geladen. Nur 1 Thread darf die Datenbank aufrufen, der Rest wartet, bis der Cache gefüllt ist, und gibt die Liste dann aus dem Cache zurück, sobald sie verfügbar ist.

Beachten Sie auch, dass die Liste der Bundesländer oder Provinzen für jedes Land einzeln zwischengespeichert wird.

    
NightOwl888 16.04.2016, 02:00
quelle

Tags und Links