2

私はASP.NETでこの質問をしました...

http://forums.asp.net/t/1584731.aspx

……でも、ここでも聞きたかった。この問題は以前に解決されていると確信しているので、車輪を再発明する理由を考えました…</p>

簡単に言うと、memcached をデータベースのキャッシング レイヤーとして使用して、ソーシャル機能を備えた Web アプリケーションを構築しています。問題を単純化するために、persons テーブルと friendConnection テーブルがある基本的なセットアップを想定してみましょう。ここでは、persons が個人情報を含み、friendConnection には、ある人物が互いに友達になっている場合に別の人物をリンクする 2 つの外部キーがあります (実際にはそうではありません)。テーブルまたは SQL を使用しますが、問題は似ています)

私のキャッシュ有効期限ロジックは単純です。テーブルへの書き込みが発生するたびに、現在キャッシュに存在するそのテーブルに関連するすべての選択ステートメントを期限切れにします。ただし、そのロジックはパフォーマンスに関してはひどいものです。なぜなら、人々が絶えず友達になっていると、キャッシュが数秒以上持続することはないからです。

より複雑なロジックでは、たとえば、現在参照されているフレンドを含むすべての select ステートメントを期限切れにすることができますが、その場合、friendConnection テーブルに関連するすべての select ステートメントを取得し、それらの関連性をチェックする必要があり、これもパフォーマンスの負担になります。

まず、私の質問は理にかなっていますか?

第二に、人々は通常、この問題をどのように解決しますか?

4

1 に答える 1

1

memcached エントリをテーブルに関連付けないでください。エントリをエンティティ (つまり、行) に関連付けます。

たとえば、メンバーごとに memcached エントリを作成すると、そのエントリにそのメンバーの友達のリストが保存されます。

PHP での例を次に示します。ASP.NET を使用していることはわかっているので、これを疑似コードとして扱ってください。:-)

<?php
$m = new Memcached();
$m->append('Luke.Doolittle', '|Bill Karwin');
$m->append('Bill Karwin', '|Luke.Doolittle');

あなたのコメントについて:

私が見ている問題は、オブジェクトを memcached に配置するための一般化されたパターンがないことです。

右。リレーショナル データベースに、データをモデル化するための正式なパターンがあります。 正規化は、冗長性を減らして異常を防ぐためにデータをモデル化するための明確に定義された方法です。最適な正規化された編成は、データ自体とデータ間の関係によって決まります。

非リレーショナル データベースでは、データ モデリングの形式化はありません。非リレーショナル データを編成する最善の方法は、データによって決まるのではなく、そのデータに対して実行する必要があるクエリによって決まります。この方法は、インデックスを定義したり、リレーショナル データベースに非正規化を適用したりするプロセスに似ています。

ロジックは、オブジェクトのタイプごとに異なります。それは理にかなっていますか?

実際には、そのオブジェクトに対して実行する必要があるクエリの種類ごとにロジックが異なります。これが、データを非リレーショナル データ ストアに冗長に格納する理由です。同じデータに対してさまざまなクエリを実行したい場合があるため、クエリの種類ごとに最適化するには、データに異なる方法でアクセスする必要があることを意味します。

この手法を使用して削除を実行するにはどうすればよいですか?

memcached から文字列全体をフェッチし、値を配列に展開し、削除する要素を削除し、新しい配列を内破して、memcached に戻します。

上記の例は非常に単純です。また、一意性も強制しません。

memcached のように機能するだけでなく、リストとセットもネイティブにサポートするRedisをチェックしてみてください。


正規化のルールを使用して、SQL を使用してデータをリレーショナルに格納します。ケースバイケースで非リレーショナル メソッドを使用して、特定の優先度の高いクエリのパフォーマンスを向上させます。プロファイリングを使用してボトルネックが実際にどこにあるかを測定および証明した後 (時期尚早の最適化を回避します)。

以下を非リレーショナル ソリューションと見なします。

  • 非正規化
  • インデックス作成 (SQL 標準ではインデックスについてまったく言及されていないことをご存知ですか?)
  • キャッシング
  • NoSQL データ ストア

ツールボックスに含まれるツールが多いほど、パフォーマンスの問題に柔軟に対応できます。

于 2010-08-01T19:23:41.853 に答える