Zunächst einmal werde ich die Frage erklären. Unter Persistenz verstehe ich die Speicherung von Daten über die Ausführung einer einzelnen Anfrage hinaus. Das ist vielleicht nicht der beste Fragentitel, also können Sie ihn gerne ändern.
So wie ich es sehe, gibt es drei Arten von Persistenz in GAE, jede "näher" an der Anfrage selbst:
Der Datenspeicher
Hier werden alle Daten höchstwahrscheinlich gespeichert sein. Sie können zwar vorübergehend in die höheren Schichten der Persistenz gehen, aber letztendlich befinden sich die Daten wirklich dort. Leider ist die wiederholte Abfrage des Datenspeichers langsam und verbraucht eine Menge Ressourcen.
Verwenden Sie, wenn...
- Speicherung von Daten, die auf unbestimmte Zeit gespeichert werden sollen.
Vermeiden Sie die Verwendung, wenn...
- Daten zu erhalten, die häufig abgefragt, aber selten aktualisiert werden.
memcache
Dabei handelt es sich um eine hochkomplexe Caching-Engine, die die Daten im Speicher ablegt und sicherstellt, dass alle Benutzer aus demselben Cache lesen bzw. in denselben Cache schreiben. Es ist eine viel schnellere Methode, Daten auf einer Schlüssel-/Wertbasis abzurufen/zu setzen, als den Datenspeicher zu verwenden. Leider können die Daten nur eine bestimmte Zeit im Speicher verbleiben, und es gibt keine Garantie dafür, dass sie so lange bleiben, wie Sie es wünschen; die Daten können jederzeit verschwinden, wenn der Speicher anderweitig benötigt wird.
Verwenden Sie, wenn...
- Sie müssen häufiger Daten abrufen, als Sie sie aktualisieren müssen. Selbst wenn die Daten häufig aktualisiert werden müssen, kann es von Nutzen sein (wenn ein paar verpasste Aktualisierungen als in Ordnung angesehen werden), indem man eine Aufgabenwarteschlange um Daten aus dem Memcache in den Datenspeicher zu übertragen.
Vermeiden Sie die Verwendung, wenn...
- Die Daten müssen häufig aktualisiert werden und müssen beim Abruf auf dem neuesten Stand sein.
Globale Variablen
Dies ist zwar keine offizielle Methode, um Daten aufzubewahren, aber sie funktioniert. Allerdings ist es die am wenigsten zuverlässige Methode, und da es keine Daten-Synchronisation zwischen den Servern hat, können persistierte Daten unterschiedlich für verschiedene Benutzer angezeigt werden (aber von dem, was ich gefunden habe, ändert sich der Server selten für den gleichen Benutzer) Theoretisch sollte dies die Methode sein, die den geringsten Overhead beim Erhalten/Setzen von Werten hat, jedoch, und könnte seinen Nutzen haben.
Verwenden Sie, wenn...
- Die Hölle friert zu? Ich weiß es nicht... Ich weiß nicht genug darüber, was hinter den Kulissen vor sich geht, um mich auf diese Methode zu verlassen. Diskutieren Sie!
Vermeiden Sie die Verwendung, wenn...
- Sie verlassen sich darauf, dass die Daten auf allen Servern gleich sind.
Cookies
Wenn die Daten benutzerspezifisch sind, kann es effizient sein, sie als Cookie im Browser des Benutzers zu speichern. Es gibt jedoch einige Fallstricke, auf die man achten sollte:
- Sicherheit - der Benutzer kann Cookies manipulieren, und böswillige Personen könnten dies ebenfalls tun. Um sicherzustellen, dass der Inhalt für alle unlesbar und unveränderbar ist, kann das Cookie mit der PyCrypto-Bibliothek verschlüsselt werden, die auf GAE verfügbar ist.
- Leistung - da die Cookies mit der jede Anfragen (auch Bilder), kann dies die genutzte Bandbreite erhöhen und die Anfragen verlangsamen. Eine Lösung besteht darin, eine andere Domäne für statische Inhalte zu verwenden, damit der Browser das Cookie für diese Inhalte nicht sendet.
Wann sollten die verschiedenen Arten der Persistenz verwendet werden? Wie können sie kombiniert werden, um den Ressourcenaufwand zu verringern/auszugleichen?