2013-01-09 14 views
5

"見る"ように設計されたページを作成しますが、データベースに書き込むユーザーはずっと少なくなります。たとえば、100人中1人のユーザーしか自分のニュースを自分のサイトに投稿することはできません。残りの人はニュースを読むだけです。MongoDBのクエリー結果のキャッシュをキャッシュする

上記の場合、実際のデータベースの変更が少ないうちに私のホームページにアクセスすると、100個の同一のクエリが実行されます。実際には99件のクエリはコンピュータの浪費です。最初のクエリの結果をキャッシュする方法はありますか?短時間で同じクエリを検出した場合、キャッシュされた結果を配信できますか?

私はMongoDBとTornadoを使用します。しかし、MongoDBはキャッシングをしないとの記事もあります。

Nginxのようなもので静的にキャッシュされたHTMLを作成することは好ましくありません。毎回Tornadoでパーソナライズされたページをレンダリングしたいからです。

答えて

3

モーター(モンゴ+トルネード)パッケージの著者は、ここでのカテゴリの彼のリストをキャッシュする例を示します:http://emptysquare.net/blog/refactoring-tornado-code-with-gen-engine/

基本的に、彼は、カテゴリのグローバルリストを定義し、それを埋めるために、データベースを照会し、ページにカテゴリが必要なときはいつでも、リストをチェックします:存在する場合はそれを使用し、そうでなければ再度クエリーして埋めます。データベースに挿入するたびにリストを無効にするように設定していますあなたの使用状況に応じて、グローバルタイムアウト変数を作成して、次に再クエリする必要があるときを追跡することができます。あなたが何か複雑なことをしているなら、これは手に負えなくなるかもしれませんが、それが最新の投稿や何かのリストであれば、それはいいと思います。

6

私はMongoDBとTornadoを使用します。しかし、MongoDBはキャッシングをしないとの記事もあります。

MongoDBはクエリをキャッシュする手段を持っていますが、実際にはメモリ管理そのものを行わないため、OSのLRUをキャッシュに使用しています。

OSがページングしたり、絶えず入れ替えたりすることなく、作業セットがLRUに収まる限り、ほとんどの場合、メモリからこのクエリを読み取る必要があります。つまり、MongoDBはキャッシュできますが、技術的にはキャッシュできません。 OSはそうです。

実際には、これらのクエリのうち99個はコンピュータの処理能力の無駄です。

これらの問題を解決するためのキャッシュ機構は、MongoDBまたはSQLによるものかどうかにかかわらず、ほとんどの技術者で同じです。もちろん、これは問題がある場合にのみ重要です。あなたが私に尋ねると、おそらくマイクロオプティマイジングです。あなたはFacebookやGoogleやYouTubeのタイプのトラフィックを取得しない限り。

キャッシュ対象は、あらかじめ集約されたMongoDB/Memcache/Redisなどのクエリをキャッシュすることから、HTMLやその他のWebリソースをキャッシュすることから、サーバ側でできるだけ小さな作業をすることにまで及んでいます。

あなたのシナリオは、私が言ったように個人的には無駄なコンピュータの能力について間違っているように思えます。このクエリーを別のコレクション/技術にキャッシュしていたとしても、おそらく気にしなかった場合と同じくらいの量の電力とリソースが、その技術の結果を取得するでしょう。しかし、その前提は、スキーマ、セットアップ等、

を右インデックスを持つあなたにダウンしています、私はあなたが良いスキーマ設計とインデックスの作成上のいくつかのリンクを読むことをお勧めします:

Nginxのようなもので静的にキャッシュされたHTMLを作成することは好ましくありません。毎回Tornadoでパーソナライズされたページをレンダリングしたいからです。

いや、私はあなたのサーバの負荷の各時間の90%となるものを、離陸したくない場合は特に、あなたが事前に分別最適化されているクエリキャッシュを心配しようとすることだと思います。ページ自体を読み込みます。

私はあなたのスキーマとインデックスに焦点を当て、本当に必要な場合はキャッシングを心配します。

+0

あなたの答えをありがとう!しかし、私はジョシュの答えがもっと私に合っていると思うだろう。しかし、私は索引付けの問題を検討します。ありがとうございました:) –

+0

@MKYungええええええええええええええええええええええええええええええええええええええええええええええええええええんばんさんのおかげです。 LRUがメモリをページアウトする必要があるまで、同時にメモリに...私はそのモジュールの完全な点を見ることはできませんが、ok: – Sammaye

+1

OPの質問から、各ページを生成するのにどれくらい時間がかかるか分かりません彼が時期尚早に最適化しているのかマイクロ最適化しているのか、提供された情報からは言えません。 – frankster

関連する問題