10 Stimmen

Speichern von Daten im Speicher: Sitzung vs. Cache vs. Statisch

Ein wenig Vorgeschichte: Ich arbeite an einer Webanwendung, die ziemlich viel Zeit benötigt, um Daten vorzubereiten / zu verarbeiten, bevor sie dem Benutzer zum Bearbeiten / Manipulieren zur Verfügung stehen. Die Datenanforderung Aufgabe ~ 15 / 20 Sekunden zu vervollständigen und ein paar Sekunden zu verarbeiten. Danach kann der Benutzer die Werte im laufenden Betrieb bearbeiten. Bei jeder Manipulation von Werten müssen die Daten vollständig neu verarbeitet werden.

Update: Um Verwirrung zu vermeiden, mache ich nur den Datenaufruf 1 Mal (die 15-Sekunden-Hit) und dann wollen, um die Ergebnisse im Speicher zu halten, so dass ich nicht haben, um es erneut aufrufen, bis der Benutzer 100% fertig ist mit ihm arbeiten. Also, der erste Abruf wird eine Weile dauern, aber mit Ajax, ich werde die In-Memory-Daten zu treffen, um ständig zu aktualisieren und halten die Reaktionszeit auf rund 2 Sekunden oder so (ich hoffe).

Um dies effizient zu gestalten, verschiebe ich die ursprünglichen Daten in den Speicher und verwende Ajax-Aufrufe zurück zum Server, damit ich die Verarbeitungszeit für die Neuberechnung reduzieren kann, die bei den Aktualisierungen dieses Benutzers erfolgt.

Hier ist meine Frage, mit Leistung im Verstand, was wäre der beste Weg, um diese Daten zu speichern, vorausgesetzt, dass nur 1 Benutzer wird w / diese Daten zu einem bestimmten Zeitpunkt arbeiten.

Außerdem könnte der Benutzer möglicherweise einige Stunden lang mit diesem Prozess beschäftigt sein. Wenn der Benutzer mit den Daten arbeitet, benötige ich eine Art Failsafe, um die aktuellen Daten des Benutzers zu speichern (entweder in einer Datenbank oder in einer serialisierten Binärdatei), falls die Sitzung auf irgendeine Weise unterbrochen wird. Mit anderen Worten, ich brauche eine Lösung, die einen geeigneten Hook hat, um die Daten des Speicherobjekts zu löschen, falls der Benutzer zu lange unterbrochen / abgelenkt wird.

So weit meine Überlegungen:

Session State - Profis: Auf einen Benutzer beschränkt. Verfügt über das Ereignis Sitzungsende, das meine Anforderungen an die Ausfallsicherheit erfüllt. Nachteile: Langsamste Ausführung meiner derzeitigen Optionen. Das Sitzungsende-Ereignis ist manchmal schwierig zu gewährleisten, dass es richtig ausgelöst wird.

Caching - Profis: Gute Perf. Hat Zugriff auf Abhängigkeiten, was später ein Bonus sein könnte, aber im aktuellen Rahmen nicht wirklich nützlich ist. Nachteile: Kein einfacher Failsafe-Schritt außer einem auf Zeitintervallen basierenden Schreiben. Globaler Anwendungsbereich - es muss sichergestellt werden, dass die Benutzer nicht mit der Arbeit der anderen kollidieren.

Statisch - Profis: Beste Perf. Einfacher zu pflegen, da ich meine aktuellen Klassenstrukturen direkt nutzen kann. Nachteile: Kein einfacher ausfallsichernder Schritt außer einem auf Zeitintervallen basierenden Schreiben. Globaler Geltungsbereich - es muss sichergestellt werden, dass die Benutzer nicht mit der Arbeit der anderen kollidieren.

Hat jemand einen Vorschlag oder einen Kommentar, welche Option ich wählen sollte?

Gracias.

Aktualisieren: Ich vergaß zu erwähnen, dass ich VB.Net, Asp.Net und Sql Server 2005 verwende, um diese Aufgabe zu erfüllen.

2voto

TheSmurf Punkte 15101

Ich stimme für die geheime Option Nr. 4: Verwendung der Datenbank für diese Aufgabe. Wenn Sie über eine Turnaround-Zeit von 20+ Sekunden für die Daten sprechen, werden Sie nichts gewinnen, wenn Sie versuchen, dies im Speicher zu tun, angesichts der Einschränkungen der von Ihnen vorgestellten Optionen. Sie können dies genauso gut in der Datenbank einrichten (mit einer eigenen Tabelle oder sogar einer separaten Datenbank, wenn die Anforderungen so groß sind).

0voto

Will Hartung Punkte 110997

Nutzen Sie die Sitzung, aber verlassen Sie sich nicht auf sie.

Lassen Sie einfach den Benutzer den Datensatz "benennen", und sorgen Sie dafür, dass der Datensatz aktiv für den Benutzer gespeichert wird, entweder automatisch oder durch etwas so Einfaches wie eine Schaltfläche "Speichern".

Sie können sich nicht auf die Sitzung verlassen, weil sie (normalerweise) an die Browser-Instanz des Benutzers gebunden ist. Wenn er den Browser versehentlich schließt (auf die Schaltfläche X klickt, sein PC abstürzt usw.), verliert er seine gesamte Arbeit. Das wäre sehr unangenehm.

Sobald der Benutzer diese Art von Kontrolle über den "dauerhaften" Zustand der Daten hat, können Sie sich darauf verlassen, dass die Sitzung die Daten im Speicher hält und diese als Cache nutzen.

0voto

Al W Punkte 7348

Ich denke, Sie haben Ihre Frage mit den Vor- und Nachteilen so gut wie beantwortet. Aber wenn Sie nach einer Bestätigung durch andere suchen, stimme ich für die Sitzung. Obwohl die Leistung langsamer ist (wissen Sie, um wie viel langsamer?), wird die Verarbeitung trotzdem sehr lange dauern. Glauben Sie, dass der Benutzer den Unterschied zwischen 15 Sekunden und 17 Sekunden bemerkt? Beide sind "ewig" in Web-Begriffen, so gehen Sie mit dem, der am einfachsten zu implementieren scheint.

vielleicht ein bisschen off topic. Ich würde empfehlen, diese langen Verarbeitungsaufrufe in asynchronen (nicht zu verwechseln mit asynchronen AJAX) Seiten unterzubringen.

Werfen Sie einen Blick auf diesen Artikel und melden Sie sich bei mir, wenn Sie ihn nicht verstehen.

http://msdn.microsoft.com/en-us/magazine/cc163725.aspx

0voto

Aaron Digulla Punkte 308693

Ich schlage vor, eine Kopie der Daten in einer neuen Datenbanktabelle (nennen wir sie EDIT) zu erstellen, wenn Sie die ersten Ergebnisse an den Benutzer senden. Wenn die Leistung ein Problem ist, führen Sie dies in einem Hintergrund-Thread durch.

Wenn der Benutzer die Daten bearbeitet, aktualisieren Sie die Tabelle (auch in einem Hintergrund-Thread, wenn die Leistung ein Problem wird). Wenn Sie Threads verwenden müssen, müssen Sie sicherstellen, dass der erste Thread beendet ist, bevor Sie mit der Aktualisierung der Zeilen beginnen.

So kann ein Benutzer weggehen, zurückkommen, sogar den Browser neu starten und die Eingabe bestätigen, wenn er mit dem Ergebnis zufrieden ist.

0voto

James Punkte 12410

Eine mögliche Alternative zu dem, was die anderen erwähnt haben, ist die Speicherung der Daten auf dem Client. Vorausgesetzt, der Datensatz ist nicht zu groß und der Code, mit dem er bearbeitet wird, kann clientseitig verarbeitet werden. Sie könnten die Daten als XML-Dateninsel oder JSON-Objekt speichern. Diese Daten könnten dann auf dem Client bearbeitet/verarbeitet werden, ohne dass ein Umweg über den Server gemacht werden muss. Wenn Sie diese Daten zurück zum Server übertragen müssen, können die resultierenden Daten über einen AJAX- oder Standard-Postback gepostet werden.

Wenn dies bei Ihren Anforderungen nicht funktioniert, würde ich die Daten einfach auf dem SQL-Server speichern, wie in einem anderen Kommentar vorgeschlagen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X