2010-07-21 10 views
5

Ich habe eine ASP.Net 4.0-Webanwendung, die sehr häufig Daten aus der Datenbank lädt und schwere Berechnungen darauf durchführt. 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.ASP.Net Cache-Freigabe

Einfache Anwendungsfall:

  • User 1 greift auf die Homepage, Cache leer ist, werden die Daten geladen/berechnet, Daten zwischengespeichert wird
  • Benutzer 2 greift auf die Homepage, Cache enthält Daten, aus dem Cache geladen Daten
  • User 3 greift auf die Homepage, Cache-Daten enthält, aus dem Cachespeicher geladenen Daten
  • User 1 reloads Webseite, vom Cache-Cache abläuft
  • Cache geladenen Daten, Daten enthält
  • Benutzer 3 aktualisiert die Homepage, Cache leer ist, werden die Daten/berechnet geladen, werden die Daten 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.

Antwort

9

Während andere die eingebauten in ASP.NET Cache (System.Web.Caching) erwähnt haben, beachten Sie bitte, dass .NET 4.0 ein ganz neues Caching-Framework stellt entworfen außerhalb des System.Web.Caching Namensraumes zu arbeiten:

System.Runtime.Caching

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

Nun, dies ist viel mehr ein Tier als die einfachen Cache Elements System.Web.Caching. Aber Sie haben den Vorteil, mehrere Cache-Speicher, Sperren von Cache-Objekten/Schlüsseln und die Erweiterungspunkte für die Erstellung eigener externer Cache-Provider zu haben - wie zum Beispiel für Microsofts neue Version Velocity distributed caching system. Es kommt mit einem integrierten MemoryCache-Provider.

Es ist wirklich nicht so schwierig zu bedienen. Gerade von MSDN Artikel über den eingebauten in Memory Provider (auch hier können Sie Ihre eigenen implementieren) in einer WinForms-Anwendung (Sie würden den Code für Ihre Web-App aus):

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!

2

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

3

Wie Eric schrieb, können Sie den eingebauten ASP.NET-Cache für was Sie verwenden - es wird von allen Sitzungen Ihrer Web-App geteilt.

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 oder ähnlich.