2009-07-30 10 views
0

Meine Anwendung zeigt Kontaktinformationen (aus ca. 2000 Kontaktdaten mit verschiedenen Detailinformationen (Namen, Telefonnummern etc.), die die Basis eines Kontaktgitters), die sich typischerweise selten ändert.ASP.NET C#: Caching Datenbank Ergebnisse, Wann/Wie Invalidat (pro Datensatz)

Eine gute Anzahl von Benutzern ist berechtigt, diese Informationen zu bearbeiten, und wenn sie bearbeitet werden, ist es erforderlich, dass die Änderung sofort für alle sichtbar ist.

Gleichzeitig möchte ich beschränken diese Informationen aus der Datenbank jedes Mal, wenn jemand diese Informationen anzeigen, vor allem, weil Tage passieren können, ohne dass etwas passiert.

Ich könnte die gesamte Liste jedes Mal abrufen, wenn eine Minute Änderung vorgenommen wird, aber das scheint auch nicht der richtige Weg. So suche ich nach einer Möglichkeit, alles zwischenzuspeichern, & ungültig holen nur einen Teil holen, der geändert wird (sagen wir, ein Datensatz), während alles andere zwischengespeichert gehalten wird. Die Seite würde bei jeder Anzeige in erster Linie aus dem Cache gespeist werden, und das Abrufen von Daten wird zu einer Ausnahme.

Wie könnte ich über diesen Entwurf gehen & Code weise? Ihre Hilfe wird sehr geschätzt.

+0

Bearbeiten sie über ein Mittel, das Sie steuern? (Z. B. eine App, die den Cache ungültig machen könnte?) –

+0

Ja, das wäre in meiner Webanwendung. – Alex

Antwort

3

Auf jedem Einsatz und bearbeiten Operation, sollten Sie Ihren Cache-Eintrag ersetzen, dann in die Datenbank

schreiben würde ich es auf diese Weise nicht tun. Wenn mehrere gleichzeitige Aktualisierungen vorhanden sind, sind Sie nicht sicher, ob die Cache-Ersetzungen in derselben Reihenfolge wie die Datenbankaktualisierungen ausgeführt werden (es sei denn, das Cacheup-Update ist Teil derselben Transaktion wie das Datenbankupdate, was übertrieben erscheint).

Stattdessen würde ich:

  • Gegenstände einlagern im Cache mit einem Cache-Schlüssel aus dem Primärschlüssel abgeleitet.

  • Entfernen Sie bei jedem Aktualisierungsvorgang einfach den Cache-Eintrag nach der Datenbankaktualisierung. Auf diese Weise wird der Cache beim nächsten Zugriff mit aktuellen Daten aktualisiert.

0

Bei jedem Einfüge- und Bearbeitungsvorgang sollten Sie Ihren Cache-Eintrag ersetzen und dann in die Datenbank schreiben. Bevor Sie eine Änderung an die Datenbank senden, sollten Sie auch prüfen, ob der Eintrag nicht ungültig ist (d. H., Sie haben eine fehlerhafte Leseoperation erhalten), was zu Datenverlust führte.

Wenn Sie wirklich besorgt über die Datenintegrität sind, könnten Sie ein Transaktionslog des Cache & db-Operationen, so dass Sie wissen, was zum Zeitpunkt eines Ausfalls in Arbeit war.

0

Es klingt, als ob Sie einen Zeitstempel jedes Updates behalten müssen. Jedem Datensatz wird ein Zeitstempel zugewiesen.

Die erste Anwendungslast ruft jeden Datensatz ab, und die App zeichnet den maximalen Zeitstempel auf.

Wenn eine Änderung gespeichert wird, wird der Zeitstempel des Datensatzes aktualisiert. Wenn andere Benutzer dann Änderungen laden müssen, können Sie nach dem letzten bekannten maximalen Zeitstempel des Clients fragen. Die anderen Benutzer erhalten nur die Änderungen.

0

MS Enterprise Library Caching Block verfügt über gute Funktionen, mit denen Sie Cache-Abhängigkeiten und Ungültig- keiten basierend auf zeit- und benachrichtigungsbasierter Ungültigmachung (einschließlich der aus einem Datenspeicher generierten) einrichten können. Überprüfen Sie es

0

Wir haben Enterprise Library Caching-Block verwendet, um dies zu tun. Wir verwenden es jedoch ohne den von Abhijeet Patel beschriebenen Backing Store.

Der Cache ist als Schlüssel/Wert-Paar aufgebaut.

Wenn der Benutzer versucht, einen Datensatz zu bekommen, überprüfen wir, ob es im Cache ist, wenn ja, aus dem Cache zurückkehren, wenn nicht aus der Datenbank abrufen und den Cache aktualisieren.

Wenn der Benutzer eine Zeile ändert, aktualisieren Sie den Cache zur gleichen Zeit wie die Datenbank aktualisiert wird.

Beachten Sie, dass dies funktioniert, wenn Sie steuern, wie die Daten aktualisiert werden. Sie müssen auch etwas mehr arbeiten, wenn der Cache auf mehr als einem Server gespeichert ist.

+0

"Aktualisieren Sie den Cache zur gleichen Zeit wie die Datenbank aktualisiert wird." - Wie in meiner Antwort beschrieben, ist es besser, einfach * aus dem Cache * zu entfernen, nachdem die Datenbank aktualisiert wurde. – Joe