0

ユーザーが相互にフォローすることで相互に「接続」できるサイトがあります。このサイトでは、「あなたには X 人の相互フォロワーがいます」または「あなたは X 人の相互フォロワーをフォローしています」などの統計を表示する必要があります。今までこの計算はリアルタイムで処理されていましたが、今ではユーザーが多すぎてリアルタイムでタイムリーに計算することができません。

この計算のパフォーマンスをキャッシュするか、別の方法で強化するオプションを検討していますが、そうする前に、この問題に対する一般的なアプローチがすでに存在している可能性があることに気付きました。

使用したテクノロジー: PHP 5.3、MySQL 5.5、nginx、および Linux 環境。

4

2 に答える 2

1

私は、あなたが多くの場所から、また非常に頻繁に友達のリストを変更していないと仮定しています。したがって、必要に応じてキャッシュを無効にする簡単な方法があります。4 行のテーブルを作成し、id1, id2, num, dateid1、id2、および日付にインデックスを設定します。回答のメソッドを使用してデータをキャッシュしますが、それを行うには、古いエントリを自分で削除する必要があります。次のようなものを追加するだけです:

if rand(1, 100) == 1:
    SQL(DELETE FROM cache WHERE date < now - ***)

また、キャッシュ内での重複を避けるために、id1 < id2 であることを確認してください。

ユーザーのフレンド リストが変更された場合、そのユーザーに接続されているすべてのキャッシュ エントリを削除します。このようにして、数値は常に最新の状態になります。

数値が多少大きくてもかまわない場合は、解決策は問題ありません。id1 < id2 になるように $key を正規化するだけです。

于 2012-06-06T13:37:06.880 に答える
0

この問題に対する私の最初のアプローチは、単にメモリに保存されているキャッシュレイヤーを使用することです(おそらくmemcacheを使用します)

ユーザーがこれらの統計を含むページを表示するときは、キャッシュをチェックして、統計がすでに存在するかどうかを確認してください。そうでない場合は、相互接続の数を計算し、ユーザーIDをキャッシュキーのハッシュとして保存します。

PHPの例、やや疑似コード:

// Fred = User ID #47, George = User ID #94

$key = md5('47,94');

// Check that cache key is valid

if ($cache->isValid($key)) {
    return $cache->get($key);
} else {
    // ..calculate mutual connections
    $cacheTime = time() + (60 * 60 * 6);
    $value = calculateMutualConnections(array(47,94));
    $cache->save($key,$value,$cacheTime);
    return $value;
}

これにより、キャッシュされた値が6時間保存されます。それで十分な時間かどうかはわかりません。このアプローチはうまくいくと思いますが、私が望むほどリアルタイムではないかもしれません。

于 2012-06-06T03:06:18.593 に答える