2009-08-21 20 views
2

Ich habe eine App für Google AppEngine geschrieben und möchte die Memcache-API verwenden, um die CPU-Zeit pro Anfrage zu reduzieren. Ich habe die Anwendung profiliert und festgestellt, dass ein großer Teil der CPU-Zeit in Template-Rendering und API-Aufrufe an den Datenspeicher ist, und nach dem Chatten mit einem Kollegen sprang ich (vielleicht ein bisschen früh?) Zu dem Schluss, dass Caching a Ein Stück gerenderter HTML-Seiten würde die CPU-Zeit pro Anfrage erheblich reduzieren. Das Caching-Muster ist ziemlich sauber, aber die Frage , wo diese Logik des Caching und Evicting setzen, ist ein bisschen ein Mysterium für mich.Wo ist der beste Ort, um die Cache-Verlegelogik in eine AppEngine-Anwendung zu versetzen?

Zum Beispiel stellen Sie sich eine Hauptseite der Anwendung eine Ankündigung Schnitt aufweist. In diesem Abschnitt müsste nach neu gerendert werden:

  • erste Lese für jedermann auf dem Konto,
  • eine neue Ankündigung hinzugefügt, und
  • eine alte Ansage wird gelöscht

Einige Optionen von denen die evict_announcements_section_from_cache() Methodenaufruf setzen:

  • in der Ankündigung des Models .delete() und .put() Methoden
  • in dem .post() Methode
  • anderswo des Request?

dann in der get Seite Request, könnte ich möglicherweise get_announcements_section() nennen, die den Standard memcache Muster folgen würde (überprüfen Cache, fügen Sie auf Miss, Rückgabewert in den Cache) und die HTML-Pass bis auf die Vorlage für das Stück Die Seite.

Ist es das typische Design-Muster, die Cache-evicting Logik im Modell oder Controller/Request, oder irgendwo anders zu setzen? Idealerweise möchte ich vermeiden, dass die Logik mit Tentakeln über den gesamten Code entfernt wird.

Antwort

1

Ich habe gerade eine solche Dekorateur in einem Open-Source-up Github-Projekt:

http://github.com/jamslevy/gae_memoize/tree/master

Es ist ein bisschen mehr in die Tiefe, für Dinge ermöglicht, wie die Ausführung der Funktion zu zwingen (wenn Sie möchten, um den Cache zu aktualisieren) oder Caching lokal erzwingen ... das waren nur Dinge, die ich in meiner App brauchte, also habe ich sie in meinen Memoise Decorator gebacken.

1

Ein paar Alternativen zu regulären Räumung:

  1. Die offensichtlichste: Sie vertreiben nicht und setzen stattdessen einen Timer. Sogar ein wirklich kurzer - ein paar Sekunden - kann den Aufwand für eine beliebte App enorm reduzieren, ohne dass die Nutzer bemerken, dass die Daten ein paar Sekunden alt sind.
  2. Anstatt zu evictieren, generieren Sie den Cache-Schlüssel basierend auf Kriterien, die sich ändern, wenn die Daten dies tun. Wenn beispielsweise der Schlüssel der letzten Ankündigung günstig abgerufen wird, können Sie ihn als Teil des Schlüssels der zwischengespeicherten Daten verwenden. Wenn eine neue Ankündigung gesendet wird, suchen Sie nach einem Schlüssel, der nicht existiert, und erstellen Sie als Ergebnis einen neuen.
Verwandte Themen