Frage ASP.Net Cache-Freigabe


Ich habe eine ASP.Net 4.0 Webanwendung, die sehr häufig Daten von der Datenbank lädt und schwere Berechnungen darauf macht. Ich möchte diese geladenen und vorbereiteten Daten in einem zentralen Cache zwischenspeichern, auf den jeder Benutzer und jeder Computer zugreifen kann, der die Anwendung verwendet.

Einfacher Anwendungsfall:

  • Benutzer 1 greift auf Webseite zu, Cache ist leer, Daten werden geladen / berechnet, Daten werden zwischengespeichert
  • Benutzer 2 greift auf die Webseite zu, der Cache enthält Daten und Daten, die aus dem Cache geladen werden
  • Benutzer 3 greift auf die Webseite zu, der Cache enthält Daten und Daten, die aus dem Cache geladen werden
  • Benutzer 1 lädt die Webseite neu, der Cache enthält Daten und Daten, die aus dem Cache geladen wurden
  • Cache verfällt
  • Benutzer 3 aktualisiert die Webseite, der Cache ist leer, Daten werden geladen / berechnet, Daten werden zwischengespeichert

Ich weiß, dass ASP.Net einen eingebauten Cache-Mechanismus hat. Was ich nicht weiß, ist, ob es zwischen verschiedenen Benutzern geteilt werden kann, die gleichzeitig auf verschiedenen Computern auf die Site zugreifen. Ich möchte auch wissen, wie sich das System in einer Webfarm-Umgebung verhält.


5
2017-07-21 15:17


Ursprung


Antworten:


Während andere den integrierten ASP.NET-Cache (System.Web.Caching) erwähnt haben, beachten Sie bitte, dass .NET 4.0 ein ganz neues Caching-Framework einführt, das außerhalb des System.Web.Caching-Namespace funktioniert:

System.Runtime.Caching

http://msdn.microsoft.com/en-us/library/system.runtime.caching(VS.100).aspx

Nun, das ist viel mehr ein Biest als das einfache System.Web.Caching's Cache-Element. Aber Sie haben den Vorteil, mehrere Cache-Speicher zu haben, die Cache-Objekte / Schlüssel zu sperren und die Erweiterungspunkte für die Erstellung eines eigenen externen Cache-Providers zu erstellen - beispielsweise einen für Microsoft's neue Velocity Distributed Caching System. Es kommt mit einem integrierten MemoryCache-Provider.

Es ist wirklich nicht so schwer zu benutzen. Direkt aus dem MSDN-Artikel über den integrierten MemoryCache-Provider (wiederum können Sie Ihren eigenen implementieren), indem Sie ihn in einer WinForms-Anwendung verwenden (Sie würden den Code für Ihre Web-App ändern):

http://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache.aspx

ObjectCache cache = MemoryCache.Default;
string fileContents = cache["filecontents"] as string;

if (fileContents == null)
{
    CacheItemPolicy policy = new CacheItemPolicy();

    List<string> filePaths = new List<string>();
    filePaths.Add("c:\\cache\\example.txt");

    policy.ChangeMonitors.Add(new 
    HostFileChangeMonitor(filePaths));

    // Fetch the file contents.
    fileContents = 
        File.ReadAllText("c:\\cache\\example.txt");

    cache.Set("filecontents", fileContents, policy);
}

Label1.Text = fileContents;

Ich habe NCache (oben erwähnt), sowie Memcached implementiert. Ich kann Ihnen sagen, dass Microsofts Velocity wirklich der Weg ist, um die Daten zu partitionieren und Redundanz innerhalb der Cache-Partitionen selbst einzurichten (sehr cool). Nicht zu vergessen, es ist kostenlos!


9
2017-07-21 15:43



Wie Eric schrieb, können Sie den integrierten Cache von ASP.NET für das verwenden, was Sie möchten - es wird von allen Sitzungen Ihrer Webanwendung gemeinsam genutzt.

Wenn Sie wirklich einen gemeinsamen Cache für mehrere Computer (Webfarm) haben möchten (oder müssen), benötigen Sie eine verteilte Caching-Lösung, z. AppFabric, NCache o.ä.


3
2017-07-21 15:31



Ja, der integrierte ASP.NET-Cache wird von allen Benutzern (Thread) in der Anwendung gemeinsam genutzt.


2
2017-07-21 15:22