回答:
RedisとMongoDBを一緒に使用すると、良い結果が得られます。MongoDBとRedis(MySQLとSphinxと共に)を実行することで有名な会社はCraiglistです。このプレゼンテーションを見るJeremy Zawodnyによるを。
MongoDBは、さまざまな方法でインデックスが付けられた、永続的なドキュメント指向のデータにとって興味深いものです。Redisは、揮発性のデータ、またはレイテンシの影響を受けやすいセミパーシスタントデータの場合により興味深いです。
MongoDBの上でのRedisの具体的な使用例をいくつか示します。
2.2より前のMongoDBには、まだ有効期限メカニズムがありません。上限のあるコレクションを実際のTTLの実装に使用することはできません。RedisにはTTLベースの有効期限メカニズムがあり、揮発性データの保存に便利です。たとえば、ユーザーセッションは通常Redisに保存されますが、ユーザーデータはMongoDBに保存され、インデックスが作成されます。MongoDB 2.2では、収集レベルで精度の低い有効期限メカニズムが導入されていることに注意してください(たとえば、データのパージに使用されます)。
Redisは、便利なセットデータタイプとそれに関連する操作(ユニオン、インターセクション、複数セットの差異など)を提供します。この機能の上に基本的なファセット検索またはタグエンジンを実装するのは非常に簡単です。これは、MongoDBの従来のインデックス作成機能に興味深い追加機能です。
Redisは、リストに対するポップ操作の効率的なブロックをサポートしています。これは、アドホック分散キューイングシステムを実装するために使用できます。バックエンドアプリケーションはタイムアウトで複数のキューをリッスンしたり、アイテムを別のキューにアトミックに転送したりできるので、MongoDBテイル可能カーソルIMOよりも柔軟性があります。アプリケーションがキューイングを必要とする場合、キューをRedisに保存するのが理にかなっています。 、永続的な機能データをMongoDBに保持します。
Redisはpub / subメカニズムも提供します。分散アプリケーションでは、イベント伝播システムが役立つ場合があります。これもRedisの優れた使用例ですが、永続データはMongoDBに保持されます。
MonisDBを使用したデータモデルの設計はRedisよりもはるかに簡単なので(Redisの方が低レベルです)、メインの永続データに対するMongoDBの柔軟性と、Redisが提供する追加機能(低レイテンシ)から利益を得ることが興味深いです、アイテムの有効期限、キュー、pub / sub、atomicブロックなど...)。それは確かに良い組み合わせです。
RedisサーバーとMongoDBサーバーを同じマシンで実行しないでください。MongoDBメモリはスワップアウトするように設計されていますが、Redisはそうではありません。MongoDBがスワッピングアクティビティをトリガーすると、Redisのパフォーマンスが壊滅的になります。それらは異なるノードで分離する必要があります。
明らかに遠いより多くの違い、非常に高い概要については:
ユースケースの場合:
技術的に:
いくつかの重複がありますが、両方を使用することは非常に一般的です。理由は次のとおりです。
Redisのは、伝統的なデータストアの代わりとして使用することができ、それは最も頻繁に使われているとなどモンゴ、Postgresqlのは、MySQL、などの他の通常の「長い」データストア、
Redisは、MongoDBをキャッシングサーバーとして適切に機能します。ここに何が起こるかです。
そのmongooseがキャッシュクエリを発行するときはいつでも、最初にキャッシュサーバーにアクセスします。
キャッシュサーバーは、その正確なクエリが以前に発行されたかどうかを確認します。
そうでない場合は、キャッシュサーバーがクエリを取得し、mongodbに送信して、Mongoがクエリを実行します。
次に、そのクエリの結果を取得し、それをキャッシュサーバーに戻します。キャッシュサーバーは、クエリの結果を自身に格納します。
そのクエリを実行するといつでもこの応答が返されるので、発行されたクエリとそれらのクエリから返された応答との間のレコードが維持されます。
キャッシュサーバーは応答を受け取り、それをmongooseに送り返します。mongooseはそれを表現するために提供し、最終的にはアプリケーション内で終了します。
同じ正確なクエリが再度発行されるたびに、mongooseは同じクエリをキャッシュサーバーに送信しますが、mongodbにクエリを送信する前にこのクエリが発行されたことがキャッシュサーバーで確認された場合は、代わりに応答を受け取ります。最後に取得したクエリをすぐにマングースに送り返します。ここにはインデックスはなく、全表スキャンもありません。
このクエリが実行されたかどうかを確認するために簡単な検索を行っていますか?はい?さて、リクエストを受け取ってすぐに送り返してください。mongoには何も送信しないでください。
mongooseサーバー、キャッシュサーバー(Redis)、Mongodbがあります。
キャッシュサーバーには、データストアのキー値タイプのデータストアがあり、すべてのキーは以前に発行されたあるタイプのクエリであり、値はそのクエリの結果です。
したがって、_idで多数のブログ投稿を検索している可能性があります。
したがって、ここのキーは、以前に調べたレコードの_idかもしれません。
したがって、mongooseが123の_idを持つブログ投稿を見つけようとする新しいクエリを発行するとします。クエリはキャッシュサーバーに流れ込み、キャッシュサーバーは_idを探していたクエリの結果があるかどうかを確認しますの123。
キャッシュサーバーに存在しない場合、このクエリが取得され、mongodbインスタンスに送信されます。Mongodbはクエリを実行し、応答を取得して返信します。
この結果はキャッシュサーバーに送り返され、キャッシュサーバーはその結果を受け取ってすぐにmongooseに送り返すので、可能な限り高速な応答が得られます。
その直後に、キャッシュサーバーは発行されたクエリも取得し、発行されたクエリのコレクションに追加し、クエリの結果を取得して、クエリに対して格納します。
そのため、将来同じクエリを再度発行すると想像できます。キャッシュサーバーにヒットし、すべてのキーを調べて、ブログポストをすでに見つけたと言っています。mongoには到達せず、クエリの結果、それを直接mongooseに送信します。
複雑なクエリロジック、インデックス、そのようなことは何もしていません。その可能な限り高速です。その単純なキー値ルックアップ。
これは、キャッシュサーバー(Redis)がMongoDBと連携する方法の概要です。
今、他の懸念があります。データを永久にキャッシュしていますか?レコードを更新するにはどうすればよいですか?
常にデータをキャッシュに格納し、キャッシュから読み取ることはしたくありません。
キャッシュサーバーは、書き込みアクションには使用されません。キャッシュ層は、データの読み取りにのみ使用されます。データを書き込む場合、書き込みは常にmongodbインスタンスに渡されるため、データを書き込むときは常に、Mongoで更新したばかりのレコードに関連する、キャッシュサーバーに保存されているデータをすべてクリアする必要があります。