:
$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にデータをコピーして即座に再アクティブ化することができます。
あなたの問題は不明であるため、何の回答も得られていないと思います。 – Galen