2009-08-21 12 views
2

J'ai écrit une application pour Google AppEngine, et j'aimerais utiliser l'API memcache pour réduire le temps CPU par requête. J'ai profilé l'application et trouvé qu'une grande partie de l'heure du processeur est dans le rendu de modèle et les appels d'API au datastore, et après avoir discuté avec un collègue, j'ai sauté (peut-être un peu tôt?) À la conclusion que morceau de HTML rendu d'une page réduirait de manière significative le temps CPU par requête. Le modèle de mise en cache est assez propre, mais la question de pour mettre cette logique de mise en cache et d'expulsion est un peu un mystère pour moi. Par exemple, imaginez que la page principale d'une application comporte une section Annonces. Cette section devrait être re-rendu après:Où est le meilleur endroit pour mettre la logique d'éviction de cache dans une application AppEngine?

  • première lecture pour tout le monde dans le compte,
  • une nouvelle annonce ajoutée et
  • une ancienne annonce en cours de suppression

Certains options où mettre l'appel de méthode evict_announcements_section_from_cache():

  • dans l'annonce Modèle de .delete() et .put() méthodes
  • dans la méthode .post() de RequestHandler
  • nulle part ailleurs?

Puis, dans la page get RequestHandler, je pourrais potentiellement appeler get_announcements_section() qui suivrait le modèle standard memcache (vérifier cache, ajoutez à mettre en cache sur miss, valeur de retour) et passer que HTML vers le bas pour le modèle de ce morceau de la page.

Est-ce le modèle de conception typique pour mettre la logique d'expulsion de cache dans le modèle, ou le Controller/RequestHandler, ou ailleurs? Idéalement, j'aimerais éviter d'expulser la logique avec des tentacules partout dans le code.

Répondre

1

J'ai un tel décorateur dans un projet Github open source:

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

Il est un peu plus en profondeur, ce qui permet des choses comme forcer l'exécution de la fonction (quand vous voulez pour rafraîchir le cache) ou forcer la mise en cache locale ... ce sont juste des choses dont j'avais besoin dans mon application, alors je les ai cuites dans mon décorateur memoize.

1

Quelques alternatives à l'expulsion régulière:

  1. La plus évidente: Ne pas expulser et mettre en place une minuterie. Même un très court - quelques secondes - peut réduire l'effort d'une énorme quantité pour une application populaire, sans même que les utilisateurs remarquant des données peuvent être quelques secondes périmées.
  2. Au lieu d'expulser, générer la clé de cache en fonction des critères qui changent lorsque les données le font. Par exemple, si la récupération de la clé de l'annonce la plus récente est bon marché, vous pouvez l'utiliser comme partie de la clé des données mises en cache. Lorsqu'une nouvelle annonce est publiée, vous cherchez une clé qui n'existe pas et en créez une nouvelle.
Questions connexes