2

私はちょうどこの考えを持っていて、それがこの問題の良い解決策であると思います、しかし私はこの方法にいくつかの欠点があるかどうか尋ねます。私は、データベースを頻繁にクエリするWebページを持っており、ページの読み込みごとに3〜5回のクエリを実行します。各クエリはダース(文字通り)の結合を行い、これらのクエリの結果はそれぞれ、PHPオブジェクトを構築するための別のクエリに使用されます。言うまでもなく、ロード時間はクラウド上でもばかげていますが、それが現在の動作方法です。

すでに構築されているオブジェクトをJSONとして、またはMongoDB-BSON形式で保存することを考えました。このタイプのキャッシュエンジンとしてMongoDBを使用することは良い解決策でしょうか?これが私がどのように機能すると思うかの例です:

  1. ユーザーがページを開いたときに、適切なIDを持つデータがMongoにない場合、MySQLへのクエリが実行され、それぞれが適切に構築されたオブジェクトに変換されているデータを返します。オブジェクトはビューに送信され、JSONに変換されてMongoに保存されます。
  2. 対応するIDを持つデータがMongoにあった場合、そのデータはPHPに送信され、変換されます。
  3. MySQLで一部のデータが変更されると(管理者がコンテンツを編集/削除する)、MongoDBの編集/削除されたオブジェクトも削除する削除関数が起動されます。

MongoDBを使用するのに良い方法ですか?この方法の欠点は何ですか?このタスクにはRedisを使用する方が良いですか?プロジェクトの他の要素にもNoSQLが必要です。そのため、memcacheの代わりにこれら2つの要素のいずれかを使用することを検討しています。

MySQLからの頻繁な結合とクエリのキャッシュとしてのMongoDBにはいくつかの情報がありますが、それはまったく関係ありません。

4

2 に答える 2

7

memcached または Redis を使用してクエリ結果をキャッシュした方がよいと思います。MongoDB は、キャッシュというよりも完全なデータベースです。memcached と Redis はどちらもキャッシュ用に最適化されています。

ただし、キャッシュを 2 レベル キャッシュとして実装することもできます。たとえば、Memcached は、データがキャッシュに保持されることを保証しません。(ストレージがいっぱいになると、データが期限切れになる場合があります)。これにより、タグのシステムを実装するのが難しくなります (たとえば、MySQL テーブルにタグを追加すると、そのテーブルに関連付けられたすべてのクエリ結果の有効期限をトリガーできます)。これに対する一般的な解決策は、キャッシングに memcached を使用することと、MySQL よりも高速であるはずの低速で信頼性の高い 2 番目のキャッシュを使用することです。MongoDB はその候補として適しています (MongoDB へのクエリを単純に保つことができる限り)。

于 2013-01-09T08:09:09.303 に答える
3

オブジェクトのキャッシュには、Memcached または Redis を使用できます。Mongodb はキャッシュとしても使用できます。Memcached とは異なり、クエリの範囲が広いという利点があるため、集計結果のキャッシュには mongodb を使用します。

たとえば、タグ付けアプリケーションで、各タグに対応するページ数を表示する必要がある場合、group byクエリのテーブル全体をスキャンします。そのため、cronjobそのグループをクエリごとに計算し、集計結果を Mongo にキャッシュします。これは、本番環境では完全にうまく機能します。数え切れないほどの他の複雑な計算でもこれを行うことができます。

また、mongodb capped コレクションTTL コレクションはキャッシングに最適です。

于 2013-01-09T08:16:16.183 に答える