2013-06-25 4 views
5

Ich habe ein etwas komplexes Berechtigungssystem, das sechs Datenbanktabellen insgesamt verwendet, und um es zu beschleunigen, würde Ich mag diese Tabellen im Speicher zwischenzuzuspeichern, anstatt die Datenbank jede Seite laden zu müssen, getroffen.Wie werden Datenbankdaten im Speicher für die Verwendung durch MVC-Anwendungen zwischengespeichert?

aber ich brauche diesen Cache zu aktualisieren, wenn ein neuer Benutzer hinzugefügt wird, oder eine Genehmigung geändert wird. Ich bin mir nicht sicher, wie man dies im Speicher-Cache tun, und wie man es sicher aktualisiert, ohne Probleme zu verursachen, wenn es zur gleichen Zeit wie das Aktualisieren

zugegriffen wird Hat jemand ein Beispiel dafür, wie man so etwas macht oder kann mich für die Forschung in die richtige Richtung weisen?

+0

Caching 6 Tische wie eine gute Idee klingt nicht. –

+0

duplizieren [Caching in C# /. Net] (http://stackoverflow.com/questions/1276569/caching-in-c-net) – Romoku

Antwort

0

Fällt es bei jeder Seitenauslastung auf die Datenbank, ist das Problem, oder ist es die Verbindung von sechs Tabellen, ist das das Problem?

Wenn der Join nur langsam ist, erstellen Sie eine Datenbanktabelle, in der die Daten viel einfacher und schneller abgefragt werden können.

Auf diese Weise müssen Sie die Übersichtstabelle jedes Mal aktualisieren, wenn Sie einen Benutzer hinzufügen oder eine Berechtigung aktualisieren. Wenn Sie all dies zu einer einzigen Transaktion zusammenfassen, sollten Sie keine Probleme mit nicht synchronisierten Daten haben.

0

können Sie die Cache-Objekt in ASP.Net gebaut verwenden. Hier ist eine article, die erklärt, wie.

1

Ohne mehr über die Struktur der Anwendung zu wissen, gibt es viele Möglichkeiten. Eine solche Option könnte darin bestehen, den Datenzugriff hinter einer Repository-Schnittstelle zu abstrahieren und In-Memory-Caching innerhalb dieses Repositorys durchzuführen. Etwas so einfaches wie eine private IEnumerable<T> für das Repository-Objekt.

So sagen Sie zum Beispiel, Sie haben ein User Objekt, das Informationen über den Benutzer (Name, Berechtigungen, etc.) enthält. Sie haben eine UserRepository mit einigen grundlegenden Abruf-/Speichermethoden darauf. Innerhalb dieses Repository, könnten Sie eine private static HashSet<User> halten, die User Objekte, die bereits aus der Datenbank abgerufen wurden, hält.

Wenn Sie eine User aus dem Repository holen, prüft er zuerst die HashSet für ein Objekt zurück, und wenn sie es nicht aus der Datenbank bekommt nicht herausfinden, fügt sie der HashSet, gibt es dann. Wenn Sie eine User speichern aktualisiert er sowohl die HashSet und die Datenbank.

Noch einmal, ohne die Besonderheiten der Codebasis und des gesamten Designs zu kennen, ist es schwierig, eine spezifischere Antwort zu geben. Dies sollte jedoch eine generische Lösung sein, die in jeder Anwendung funktioniert.

0

Ich kann Cache solche Daten in Application state object vorschlagen. Verwenden Sie für die threadsichere Verwendung lock operator. Ihr Code würde wie folgt aussehen:

public void ClearTableCache(string tableName) 
{ 
    lock (System.Web.HttpContext.Current) 
    { 
     System.Web.HttpContext.Current.Application[tableName] = null; 
    }   
} 

public SomeDataType GetTableData(string tableName) 
{ 
    lock (System.Web.HttpContext.Current) 
    { 
     if (System.Web.HttpContext.Current.Application[tableName] == null) 
     { 
      //get data from DB then put it into application state 
      System.Web.HttpContext.Current.Application[tableName] = dataFromDb; 
      return dataFromDb; 
     } 
     return (SomeDataType)System.Web.HttpContext.Current.Application[tableName]; 
    }    
} 
1

Ich würde Elemente zwischenspeichern, wie Sie es verwenden, die auf Ihre Datenschicht bedeutet, wenn Sie bekommen Sie eine Datensicherung auf dem Cache überprüfen, ob es dort sonst vorhanden ist, dass Sie gehen zur Datenbank und cache das Ergebnis danach.

public AccessModel GetAccess(string accessCode) 
{ 
    if(cache.Get<string>(accessCode) != null) 
      return cache.Get<string>(accessCode); 

    return GetFromDatabase(accessCode); 
} 

Dann würde ich als nächstes auf meine Cache Invalidate Strategie denken. Sie können zwei Möglichkeiten folgen:

Man würde festgelegt werden, verfallen Daten zu 1 Stunde und dann drücken Sie einfach die Datenbank einmal in einer Stunde.

Oder den Cache ungültig machen, wenn Sie die Daten aktualisieren. Das ist sicher das Beste, aber ein bisschen komplexer.

Ich hoffe, es hilft.

Hinweis: Sie können entweder ASP.NET Cache oder eine andere Lösung wie Memcached auf Ihrer Infrastruktur abhängig

Verwandte Themen