2009-08-29 4 views
5

私は以下の考えを持っていました:いくつかの種類の掲示板をモデル化するdjangoを使って書かれたWebアプリケーションがあるとします。このボードにはスレッドがたくさんありますが、そのうちのいくつかは1時間あたりのポスト/ビュー数が最も多くなります。 スレッドページはユーザーごとに少し異なります。したがって、レンダリングされたページ全体をキャッシュすることはできず、レンダリングされたページの一部だけをキャッシュすることもオプションではありません。リクエスト間のDjangoのオブジェクトのオブジェクトストア

私のアイデアは次のとおりです。スレッド内のオブジェクト構造をメモリに作成します(ポストとそれを表示するために必要なすべてのデータがあります)。新しいメッセージが投稿された場​​合は、構造が更新され、Xのすべての投稿(または何時でも何時でも)に新しいメッセージがデータベースに書き戻されます。アプリがクラッシュした場合、投稿の一部が失われますが、これは間違いありません(ユーザーと管理者向け)。

質問:このような持続性をシリアル化なしでのメモリストレージに作成することはできますか?(serialize-> memcachedはありません)?私が理解しているように、WSGIアプリケーション(Djangoのような)は要求間のシャットダウンをせずに連続プロセスで実行されるため、理論上可能でなければなりません。使用できるAPIはありますか?そうでない場合:見えるべき点は?

/edit1:「永続的」は通常異なる意味を持つことがわかりますが、この場合は「要求の合間」を厳密に意味します。

+4

シリアル化で何が問題になっていますか?あなたのアプリケーションをプロファイリングしましたか?データベースI/Oにボトルネックがありますか? –

答えて

5

生産WSGI環境では、複数のワーカープロセスが同時に要求を処理している可能性があります。これらのワーカープロセスは時々リサイクルされ、ローカルメモリオブジェクトが失われることを意味します。

しかし、これが本当に必要な場合は(そして必ず実行してください)、Djangoのcaching frameworkを調べて、ローカルメモリキャッシュをチェックアウトすることをお勧めします。また、sessionsを見てください。

ローカルメモリキャッシングでさえ、シリアル化(pickle)を使用しています。カスタムキャッシュバックエンド(the docsを参照)を実装することにより、シリアル化なしでローカルメモリキャッシュを実装するのは簡単です。シリアライゼーションなしでキャッシュを作成するための開始点としてlocmem.pyのコードを使用できます。

しかし、ここで早すぎる最適化を行っていると思われますか?

+0

Iveは、大きなオブジェクトをセッションに入れるのは悪い考えです。セッションを避けてキャッシュを使用する必要があるような、ある種のソフトなサイズ制限がありますか?どのようにあなたのキャッシュに格納されている特定のオブジェクトにセッションを関連付けると思いますか?アソシエーションを持っていて、セッションが途中で終了した場合、どのようにして関連オブジェクトをキャッシュからクリアしますか? – bischoffingston

0

メモリ内の記憶域は永続的ではありません。

あなたは、これまでにX個のオブジェクトの新しい投稿をデータベースに書きたいと思っています。私はこれがスピードアップの理由だと思います。しかし、遅かれ早かれそれらを直列化する必要があるので、実際にはそのように時間を節約することはできません。ただし、新しいオブジェクトをディスクにフラッシュしないことで時間を節約できますが、ほとんどのデータベースはすでにそのオブジェクトをサポートしています。

しかし、レンダリングされたページをキャッシュすることについても説明します。これはキャッシュされて読み込まれます。そこには、あなたが言う最終結果をキャッシュすることはできませんが、データベースクエリの結果をキャッシュすることができます。つまり、新しいメッセージはすぐには更新されませんが、表示するには1分ほどかかりますが、ほとんどの人はこれを受け入れられると考えています。

更新:この場合は、そうではありません。しかし、まだ簡単にクエリ結果をキャッシュすることができますが、新しいレスポンスが追加されたときにそのキャッシュを無効にする必要があります。それが助けになるはずです。

+0

私は、「永続的」で「要求の間」を意味することが明らかであると思いました。 実際に最後の点は私がメモリストレージでこれについて考えた理由です。新しい投稿をすぐに表示する必要があるので、私は読み込みキャッシュに頼ることはできませんが、ページを(ほぼ)各リクエストに表示する必要があります。確かに、キャッシュされたページで実行できる要求がいくつかありますが、ほとんどの場合はそうではありません。 –

+0

ディスクへの書き込みがボトルネックであれば、ここでは深刻なことになります。 ;)しかし、あなたは新しい応答が書かれたときにあなたが無効にするmemcacheを持つことができるはずです。 –

関連する問題