2009-05-30 24 views
0

設定:ハイトラフィックのウェブサイトと、表示したい画像のURLのリスト。 1つのイメージスポットがあり、イメージURLのセットの各アイテムにはその日のターゲット表示率があります。例:トラフィックが多いパーセンテージベースの選択肢はありますか?

  • 画像1 - 10%
  • 画像2 - 30%
  • 画像3 - 60%

トラフィック量は日々変わる可能性があるので、私は内のパーセンテージをやっています画像もランダムに選択する必要がありますが、分布に正確に適合している必要があります。

質問:私はmemcacheでこれを行うためのPOCコードを実装しましたが、データが格納される方法には不快です(複数のハッシュキーはメタデータを持つ「マスターレコード」によってマップされます)。また、Memcacheサーバーがダウンした場合、これをデータベースに戻す必要があります。私はまた、マスターレコードの並行性の問題も懸念しています。

これを行う簡単な方法はありますか?おそらく高速のmysqlクエリまたはこれにmemcacheをもたらす良い方法は?

おかげ

+0

あなたの問題は不明であるため、何の回答も得られていないと思います。 – Galen

答えて

0

Aは、最も可能性が高いので、私はmemcacheのに固執するだろう時間がかかるとしているデータベースにヒット。 MemcacheよりもMySQLを使用して並行性の問題が増えます。 memcacheは多くの要求を処理するための優れた機能を備えており、サーバーがダウンすると、トラフィックの多いWebサイトでのご心配は最小限に抑えられます。

MySQLの専門家は、より詳細な情報を提供すれば、良いクエリ構造でここにパイプすることができます。

あなたは、画像を指して1000の値のブロックは、あなたが戻ります事前に生成言っ行うことができ
1

$distribution = "011022201111202102100120 ..." # exactly evenly distributed 

は次にMySQLとmemcacheの中でそのブロックを格納し、両方のMySQLに(別のキーを使用しますmemcache)を使用して、上記の文字列の現在のインデックス値を保持します。イメージスクリプトがヒットするたびにmemcacheの値をインクリメントします。 memcacheがダウンした場合は、代わりにMySQLに行きます(UPDATE、SELECT、この部分を実行するより良い方法があります)。

memcacheとMySQLを同期させておくと、現在のインデックス値をmemcacheからMySQLにコピーすることができます。正確さは失われますが、この状況ではそれほど重要ではないかもしれません。

MySQLとmemcacheの両方に複数のディストリビューションを保存し、現在アクティブなディストリビューションを指す別のキーを持つことができます。そうすれば、将来のイメージブロックを事前に生成できます。インデックスがディストリビューションを超えると、スクリプトはキーをインクリメントして次のキーに進みます。

大雑把:

function FetchImageFname() 
{ 
    $images = array(0 => 'image1.jpg', 1 => 'image2.jpg', 2 => 'image3.jpg'); 
    $distribution = FetchDistribution(); 
    $currentindex = FetchCurrentIndex(); 

    $x = 0; 
    while($distribution[$currentindex] == '' && $x < 10); 
    { 
    IncrementCurrentDistribKey(); 
    $distribution = FetchDistribution(); 
    $currentindex = FetchCurrentIndex(); 
    $x++; 
    } 

    if($distribution[$currentindex] == '') 
    { 
    // XXX Tried and failed. Send error to central logs. 
    return($images[0]); 
    } 

    return($distribution[$currentindex]); 
} 

function FetchDistribution() 
{ 
    $current_distib_key = FetchCurrentDistribKey(); 
    $distribution = FetchFromMemcache($current_distrib_key); 
    if(!$distribution) 
    $distribution = FetchFromMySQL($current_distrib_key); 
    return $distribution; 
} 

function FetchCurrentIndex() 
{ 
    $current_index = MemcacheIncrement('foo'); 
    if($current_index === false) 
    $current_index = MySQLIncrement('foo'); 
    return $current_index; 
} 

...などの関数名は、一種の悪臭を放つが、私はあなたのアイデアを得ると思います。 Memcacheサーバーが再びバックアップされると、MySQLからMemcacheにデータをコピーして即座に再アクティブ化することができます。

関連する問題