2009-08-21 2 views
2

Google AppEngine用のアプリケーションを作成しました。memcache APIを使用して、リクエストごとのCPU時間を削減したいと考えています。私はアプリケーションをプロファイリングして、CPU時間の大きな部分がテンプレートレンダリングとAPI呼び出しをデータストアに持っていることを発見しました。同僚とチャットした後、(おそらく少し早いですが)キャッシングページのレンダリングされたHTMLのチャンクは、リクエストあたりのCPU時間を大幅に削減します。キャッシングのパターンはかなりきれいですが、の質問は、キャッシングと追い出しのこのロジックを置くためにはは私には謎のビットです。AppEngineアプリケーションにキャッシュを呼び出すロジックを配置する最適な場所はどこですか?

たとえば、アプリケーションのメインページにアナウンスセクションがあるとします。このセクションでは、後に再レンダリングする必要があります:

  • 最初のアカウントで、誰のための読み取り、
  • 追加された新しい発表、および
  • 古い発表は

一部を削除されますevict_announcements_section_from_cache()メソッドコールを配置する場所のオプション:

  • アナウンスモデルの.delete()、および.put()メソッド
  • RequestHandlerの.post()メソッド
  • 他のすべての場所?

は、その後のRequestHandlerのgetページでは、私は潜在的に標準memcacheのパターンを(ミス、戻り値にキャッシュするために追加し、キャッシュをチェック)に従うとのそのチャンクのためにダウンしたテンプレートにそのHTMLを渡すことになるget_announcements_section()を呼び出すことができますページ。

モデル、またはController/RequestHandlerなどのキャッシュに記憶されたロジックを配置するのが一般的な設計パターンですか?理想的には、コードのいたるところで触手を使って論理を取り除くことを避けたいと思います。

答えて

1

私は、オープンソースのGithubプロジェクトにちょうどそのようなデコレータを持っている:

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

それはあなたがしたいとき(関数の実行を強制するようなことを可能に深いもう少しですキャッシュをリフレッシュするため)、ローカルにキャッシュを強制する...これは私のアプリで必要なものだったので、私はそれらを私のメモデコレータに焼き付けました。

1

定期的な立ち退きの代替のカップル:

  1. 明白な1:立ち退かせる、と代わりにタイマーを設定しないでください。非常に短い1秒(数秒)でも、ポピュラーなアプリのための膨大な労力を削減することができます。
  2. データを削除する代わりに、データの変更時に変更される基準に基づいてキャッシュキーを生成します。たとえば、最新のアナウンスのキーを取得するのが安ければ、キャッシュされたデータのキーの一部としてそれを使用できます。新しいアナウンスが投稿されると、存在しないキーを探して結果として新しいキーを作成します。
関連する問題