Vorteile von Cache gegenüber Sitzung

68

Was ist der Unterschied zwischen dem Speichern einer Datentabelle in Session und Cache? Was sind die Vor- und Nachteile?

Wenn es sich also um eine einfache Suchseite handelt, die ein Ergebnis in einer Datentabelle zurückgibt und diese an eine Rasteransicht bindet. Wenn Benutzer 'a' sucht und Benutzer 'b' sucht, ist es besser, es in Sitzung zu speichern, da jeder Benutzer höchstwahrscheinlich unterschiedliche Ergebnisse haben würde, oder kann ich jede seiner Suchen immer noch im Cache speichern oder macht dies keinen Sinn, da es gibt nur ein Cache. Ich denke im Grunde, was ich damit sagen will, ist, dass der Cache überschrieben wird.

Xaisoft
quelle
Sie würden Daten zwischenspeichern, die alle Benutzer in der Anwendung verwenden sollen. Daten, die sich historisch möglicherweise nicht ändern. Die Sitzung sollte zum Speichern von Daten für einen Benutzerkontext verwendet werden, wenn beispielsweise die Ergebnisse der zwischengespeicherten Daten gefiltert werden sollen.
Piotr Kula
3
HttpContext.Current.Cache vs HttpRuntime.Cache?
Kiquenet
1
@Kiquenet Ich habe dich wirklich bewundert.
Ozgur
@Kiquenet Dann lass mich dir mein Verständnis dazu sagen. In HttpContext geht es um die aktuelle Anforderung. Es ist nur während der Lebensdauer der Anforderung aktiv. Aber HttpRuntime bleibt die ganze Zeit am Leben. Somit bleibt Ihr Cache so lange aktiv, wie Sie ihm die Ablaufdauer zuweisen. Ich bin mir nicht sicher, aber das habe ich gesehen, als ich es getestet habe.
Ozgur

Antworten:

82

Ein wichtiger Unterschied besteht darin, dass Elemente im Cache nach einer bestimmten Zeit ablaufen können (aus dem Cache entfernt werden). Elemente, die in eine Sitzung eingefügt werden, bleiben dort, bis die Sitzung endet.

ASP.NET kann auch Elemente aus dem Cache entfernen, wenn der verfügbare Speicherplatz knapp wird.

Ein weiterer Unterschied: Der Sitzungsstatus kann extern (Statusserver, SQL Server) gehalten und von mehreren Instanzen Ihrer Webanwendung gemeinsam genutzt werden (zum Lastenausgleich). Dies ist beim Cache nicht der Fall.

Abgesehen von diesen Unterschieden (wie andere angemerkt haben): Sitzung ist pro Benutzer / Sitzung, während Cache pro Anwendung ist.

M4N
quelle
7
Tatsächlich kann der Cache mit Velocity
Webjedi
3
Es kann ein Cache implementiert werden, der die Werte extern speichert, das .NET-Framework unterstützt jedoch standardmäßig keinen externen Cache. Für Sitzungen werden jedoch externe Sitzungen unterstützt.
Kibbee
Eine weitere Einschränkung ist, dass IIS die gesamte Sitzung hydratisiert. Jede Anforderung im Vergleich zum Cache kann viel detaillierter sein.
Ron
1
Bitte überprüfen Sie andere Parameter! Welcher von ihnen ist am sichersten? Welche von ihnen haben die größte Größe? Welcher von ihnen ist fehlerfrei?
Ali Rasouli
29

AFAIK, Der Hauptunterschied besteht darin, dass die Sitzung pro Benutzer stattfindet, während der Cache für Elemente mit Anwendungsbereich vorgesehen ist.

Wie in den anderen Antworten angegeben, können Sie Informationen pro Benutzer im Cache speichern, sofern Sie einen Schlüssel angeben (entweder nach Sitzung oder Cookie). Dann hätten Sie mehr Kontrolle, um Elemente im Cache abzulaufen und Abhängigkeiten von ihnen festzulegen. Wenn sich die betreffende Datentabelle regelmäßig ändert, ist das Zwischenspeichern wahrscheinlich eine geeignete Option. Andernfalls ist eine statische Sitzung möglicherweise besser geeignet. Steven Smith hat ein exzellentes Video zum Caching bei dnrtv , das einen Besuch wert ist.

Es hängt wirklich davon ab, was Sie erreichen möchten und wie viel Zeit Sie haben. Es gibt einige andere Alternativen, die Sie in Bezug darauf berücksichtigen sollten, wie Sie den Status in einer Anwendung speichern. Abhängig von der Größe der Tabelle können Sie den Status in einem Cookie speichern (verschlüsselt, wenn es sich um vertrauliche Informationen handelt). Alternativ können Sie ein statisches Feld auf einer Seite oder Klasse verwenden, wenn es sich um anwendungsbezogene Daten handelt. Es gibt auch das Anwendungsobjekt.

Update : Ich denke, die Schlüsselfrage, die Sie sich stellen müssen, ist, wer diese Daten sehen soll.

Are they going to access the data frequently?  

(Nein, mach dir keine Sorgen).

Is it going to change?  

(Nein, verwenden Sie ein statisches Feld oder eine Anwendung).

Is it acceptable for user a and user b to see the same results?  

(Nein, verwenden Sie den Cache mit einem Schlüssel, der aus dem Benutzernamen und dem Suchbegriff besteht.)
(Ja, verwenden Sie den Cache mit einem Schlüssel des Suchbegriffs.)

Ehrlich gesagt, wenn Sie in Ihrer Entwicklung nicht weit sind, würde ich in Betracht ziehen, das Caching- / State-Problem auf einen späteren Zeitpunkt abzustellen - Sie brauchen es möglicherweise nicht einmal.

Die ersten drei Regeln für die Leistungsoptimierung sind: 1. Messen, 2. Messen Sie weitere. 3. Messen Sie erneut ...

Martin Clarke
quelle
3
Nur wenn Sie den Cache-Schlüssel für diese Sitzungs-
ID
2
HttpContext.Current.Cache vs HttpRuntime.Cache ? HttpContext.Current.Cache ist pro Benutzer ?
Kiquenet
Sie sagen: Messen Sie noch einmal mehr . Wie besser messen, Muster und Praktiken ? irgendeine Probe?
PreguntonCojoneroCabrón
15

Ein weiterer wichtiger Unterschied: Der Sitzungsstatus wird blockiert, wenn gleichzeitig asynchrone Ajax-Anforderungen ausgeführt werden. Dies wirkt sich auf die Leistung aus

Nabeel
quelle
5

Der Cache befindet sich im Anwendungsbereich, um die Häufigkeit zu verringern, mit der Daten abgerufen werden. Die Sitzung befindet sich im Sitzungsbereich eines Benutzers, um einen bestimmten Benutzerstatus anzugeben.

Greg Ogle
quelle
5

Nun, es hängt davon ab, wie Sie die Sitzung für ASP.NET konfiguriert haben. Speichern Sie die Sitzung in einer Datenbank oder im Speicher? Wenn Sie im Speicher einen separaten Server verwenden oder den aktuellen Webserver für die Sitzung verwenden?

Abhängig davon, wie die Dinge für Sie eingerichtet sind, kann dies Auswirkungen auf die Leistung haben, wenn Sie so etwas wie eine Datentabelle verwenden, die mir sagt, dass Sie möglicherweise große Datenmengen speichern.

Außerdem wird die Sitzung pro Benutzer gespeichert und pro Benutzer mithilfe des Sitzungstickets abgerufen, das entweder in einem Sitzungscookie oder in der URL gespeichert ist, wenn keine Cookies akzeptiert werden und Sie ASP.NET auf den Cookieless-Modus eingestellt haben. Alles, was Sie zwischenspeichern, wird auf Anwendungsebene zwischengespeichert und steht allen Benutzersitzungen zur Verfügung, die möglicherweise Ihren Wünschen entsprechen oder nicht.

Andrew Hare
quelle
4

Die Sitzung ist pro Benutzer, der Cache ist für die Anwendung.

Elemente im Cache können und werden automatisch entfernt, basierend auf Ablaufzeiten (gleitend oder fest) und Speicherbeschränkungen des IIS-Arbeitsprozesses.

Grundsätzlich wird nicht garantiert, dass Elemente im Cache vorhanden sind, aber die Sitzung bleibt dort, bis die Sitzung endet.

Das Speichern von Elementen auf Benutzerbasis (über eine Sitzung oder eine kreative Verwendung des Cache) kann zu einer hohen Speichernutzung führen und sollte sorgfältig abgewogen werden.

Wenn IIS den Arbeitsprozess zurücksetzt, können Sie außerdem Ihren Cache und Ihre Sitzung verlieren.

Greg
quelle
1
Die Sitzung ist ebenfalls nicht garantiert.
StingyJack
2
HttpContext.Current.Cache vs HttpRuntime.Cache Unterschiede ? HttpContext.Current.Cache ist pro Benutzer ?
Kiquenet
4

Siehe diese Antwort .

Eine Sitzung kann die Leistung Ihrer App beeinträchtigen, es sei denn, Sie verwenden einen Backend-Anbieter wie Memcached oder Velocity. Im Allgemeinen sollten Sie es vermeiden.

StingyJack
quelle
0

Soweit ich weiß, hängt alles von Ihren Bedürfnissen ab.

Wann immer Sie den Status für die Benutzer beibehalten müssen, müssen Sie bei der Verwendung von Sitzungen sehr vorsichtig sein. Die Standardeinstellung ist "InProc", das den Speicher des einzelnen Servers verwendet und in Cloud-basierten Anwendungen nicht gut funktioniert. Dies gilt möglicherweise für diejenigen unter Ihnen, die Ihre Anwendung in Webfarmumgebungen mit mehreren Instanzen hosten. Windows Azure Load Balancer verwendet die Round-Robin-Zuweisung innerhalb verbundener Knoten.

Sie haben mehrere Optionen im Sitzungsspeicher. SQL Server kann auch als Speicher für den Sitzungsstatus verwendet werden. Auf Azure sind benutzerdefinierte Sitzungstechniken wie der Tabellenspeicheranbieter usw. verfügbar.

Der Cache wird ebenfalls im Speicher des Servers gespeichert, hat jedoch keine Auswirkungen auf die Benutzer. Jeder Benutzer innerhalb desselben Pools kann auf die Anwendungscache-Daten zugreifen. Kurz gesagt, in der Cloud müssen wir den von den Cloud-Anbietern bereitgestellten Caching-Dienst verwenden. Azure bietet einen verteilten Windows Azure-Caching-Dienst.

Tatsächlich kümmern sich Entwickler nicht um die Auswirkungen von Zustandsverwaltungstechniken, wenn sie die Technik in den Anwendungen anwenden. Es

"Wenn Ihr Client keine Cloud-Unterstützung hat, machen Sie sich keine Sorgen über die Cloud-Szenarien."

Usman Khair
quelle