2009-08-05 13 views
3

Sollten Sie Informationen über den Benutzer, der für jede Anfrage benötigt wird, speichern z. Rolle, E-Mail, Benutzername usw.Benutzerinformationen in Sitzung speichern?

in Session, oder ist in Ordnung, ginge die Datenbank jede Anforderung für diese Information ??

Danke

Antwort

0

Ich bevorzuge, ein verschlüsseltes Cookie dafür zu verwenden. Die DB-Aufrufe können in großen, ausgelasteten Systemen teuer werden. Sitzung ist in Ordnung, aber wenn Ihr Sitzungs-Backend Datenbank-betrieben wird, kann das auch teuer werden. Natürlich müssen Sie bei der Verwendung von Cookies eine Authentifizierungstokenprüfung durchführen.

+0

Authentifizierungstoken prüfen? Du meinst nur die Formulare Auth Zeug? – Schotime

+0

sicher, hängt von Ihren Bedürfnissen ab! – grenade

0

Das hängt davon ab, was Sie mit "Sollte" meinen. Ich habe an einigen Apps gearbeitet, die die Sitzung zum Zwischenspeichern von Benutzerinformationen verwendet haben. Der Ansatz hat gut funktioniert und die Anzahl der für jede Webanforderung erforderlichen Datenbankumläufe reduziert.

Auf der anderen Seite, es stellt State auf Ihren Webservern, so dass Sie entweder bei einem Webserver bleiben müssen, "sicky sessions" verwenden (was die Verwaltung von Webservern etwas komplizierter machen kann) oder die Sitzungsinformationen zu speichern in einem geteilten Datenspeicher (der jeglichen Leistungsgewinn beseitigt, den Sie vielleicht von der ersten Verwendung gehabt hätten).

0

Session-Daten können auch in der Datenbank gespeichert werden, was sehr nützlich ist, wenn Ihre Website ist in einem Web-Garten og Farm ausgeführt wird. Wenn die Sitzung InProc ausgeführt wird, werden die Benutzerdaten im Arbeitsspeicher gespeichert, was sehr viel schneller ist, jedoch auf Kosten der Skalierbarkeit.

Eine andere übliche Möglichkeit wäre, sie als ViewState zu speichern, dann wird sie bei jedem Postback zwischen Client und Server zurück und viert gesendet, was natürlich einen Bandbreitentreffer verursacht, aber viel besser skaliert als die InProc-Sitzung.

Persönlich mag ich Sitzungszustand besser, wenn die Site klein ich es InProc laufen, und ob/wann die Seite wächst ich kann es ändern, anstatt eine Datenbank zu verwenden.

3

Wenn Sie keinen Lastenausgleich planen, ist der Sitzungsstatus vollkommen akzeptabel. Seien Sie vorsichtig, wenn der Sitzungsstatus für die Verwendung der Datenbankpersistenz konfiguriert ist, da dann nicht nur die Datenbank betroffen ist, sondern auch ein Overhead der Serialisierung der Objekte entsteht.

Wenn es sich um benutzerspezifische Daten handelt, könnte ein verteiltes Hashtable-Cache-System funktionieren. Dinge wie Memcached sind dafür gut, da sie In-Memory-Caches (Performance) sind, aber auf mehrere Server verteilt sind (Load Balancing), so dass Sie das Beste aus beiden Welten erhalten.

Natürlich, wenn es die Daten, die regelmäßig ändert, vor allem, wenn Sie andere Systeme, die die Datenbank ohne die Web-App wissen, ändern könnte, dann zurück in die Datenbank gehen könnte die einzige Option sein.

+0

Wenn Sie einen Memcache-Sitzungsspeicher verwenden und wissen, welche Benutzerdaten Sie ändern, können Sie die Sitzungsdaten immer ungültig machen, wenn der Sitzungsschlüssel in irgendeiner Weise an den Benutzer gebunden ist (z. B. eine Kartensitzungs-ID -> userId). Auf diese Weise können Sie den Sitzungsspeicher selbst bei häufigen Änderungen nutzen. – Runeborg

+0

Ja, aber der Punkt ist, dass es bei häufigen Änderungen besser ist, den (De-) Serialisierungsaufwand zu vermeiden und einfach zur Datenbank zu gehen. Es würde Leistungsmessungen erfordern, um zu sehen, welche Methode unter Last besser funktioniert. –

0

Ich behalte die Benutzer-ID in Sitzung und ich halte die aktiven Benutzerdatensätze in Cache für viele meiner Anwendungen, aber ich neige dazu, den Inhalt aller Dropdown-Listen im Cache zu behalten, und ich muss ein Dropdown-Menü präsentieren von Benutzern hin und wieder.

Ich habe eine Reihe von Menschen hat ausrufen „OMG Sie halten, dass in Cache!?!?“ aber eigentlich funktioniert es großartig. Besser, dass ich genau eine Kopie der Benutzerliste in Cache als eine Kopie pro Anwendungsinstanz habe (100 gleichzeitige Benutzer bedeutet möglicherweise 100 Kopien der Benutzerliste im Speicher). Im Allgemeinen lege ich alles, was sich nicht häufig ändert, in den Cache und zwinge es aus dem Cache heraus, wenn es sich ändert, also wird es beim nächsten Zugriff neu geladen.

0

Es hängt von Ihrer Website/App ab.Die allgemeinen Regeln lauten etwa so:

Speichern in der Sitzung funktioniert gut, wenn die Anzahl der gleichzeitigen Benutzer ziemlich niedrig ist und die Daten relativ klein sind.

Speichern in einem Cookie funktioniert gut, wenn die Anzahl der gleichzeitigen Benutzer hoch ist und die Größe der Daten relativ niedrig ist. Offensichtlich sind Cookies öffentlich sichtbar. Wenn es also sensibel ist, wie zum Beispiel E-Mail, sollte es verschlüsselt werden.

Speichern in der Datenbank funktioniert gut, wenn die Größe der Daten groß ist.

Hinweis. Wie andere gesagt haben, wenn Sie eine Webfarm verwenden, würde ich das Speichern in der Sitzung vergessen.

Martin Fowler hat eine gute Beschreibung der Optionen in 'Muster der Enterprise Application Architecture', aber ich bin mir nicht sicher, ob er Sachen online hat.

Wenn für die Website/App eine Authentifizierung erforderlich ist, verfügt .NET über eine gute integrierte Funktionalität zum Speichern von Benutzerrollen und eindeutigen Benutzernamen. Wenn Sie dies während der Authentifizierung speichern, können Sie auf diese Werte über User.IsInRole() und User.Identity.Name zugreifen.

Wird in der Sitzung gespeichert, was zu Leistungsproblemen führt? Wenn die Größe Ihrer Daten relativ klein ist, wie zum Beispiel E-Mail, würde ich die Sitzung oder Cookies verwenden und die Datenbank meiden. Führen Sie Leistungstests durch und sehen Sie, welche Leistung für Sie am besten ist.

Verwandte Themen