1

現在、MySQL と iMagick を使用して画像のギャラリーを作成しています。各画像はアップロードされ、imageMagick を介して実行され、ファイル名と拡張子が PID、ファイル名、拡張子の形式で MySQL DB に保存されます。以下のコードを使用して、DB を反復処理して、すべての画像をページに正常に出力できます。

$gallerySQL = mysqli_query($connection, "SELECT * FROM gallery");
while($row = mysqli_fetch_array($gallerySQL)){
    $file = $row['filename'].$row['ext'];
    $thumb = $row['filename']."-thumb.png";
    $blur = $row['filename']."-thumbB.png";
    ?>
    <a href="<?php echo $file ?>"><img src="<?php echo $thumb ?>" onmouseover="this.src='<?php echo $blur ?>'" onmouseout="this.src='<?php echo $thumb ?>'" alt="Loaded from DB" /></a>
    <?php
}
?>

ただし、me​​mcached をこれに実装する方法がわかりません。画像ギャラリーは頻繁に変更されるわけではないため、ページが読み込まれるたびに複数の DB ヒットを取得するよりも、キャッシュに適しているようです。これを行うために私が書いたコードは次のとおりです。

$num = 0;
$key = "img_".$num;
$pics = mysqli_query($connection, "SELECT * FROM gallery");

while($num<4){
while($row = mysqli_fetch_array($pics)){
    $key = "img_".$num;
    if(!$mem->get($key)){

        $file = $row['filename'].$row['ext'];
        $thumb = $row['filename']."-thumb.png";
        $blur = $row['filename']."-thumbB.png";
        ?>
        <a href="<?php echo $file; ?>"><img src="<?php echo $thumb ?>" onmouseover="this.src='<?php echo $blur ?>'" onmouseout="this.src='<?php echo $thumb ?>'" alt="Loaded from DB" /></a>
        <?php

        $key = "img_".$num;
        $mem->add($key, $row['filename']);  

        $key = "ext_".$num;
        $mem->add($key, $row['ext']);

    } else {
        $key = "img_".$num;
        $file = $mem->get($key);
        $key = "ext_".$num;
        $ext = $mem->get($key);
        ?>
        <a href="<?php echo $file.$ext; ?>"><img src="<?php echo $file."-thumb.png" ?>" onmouseover="this.src='<?php echo $file."-thumbB.png" ?>'" onmouseout="this.src='<?php echo $file."-thumb.png" ?>'" alt="Loaded from MemCached" /></a>
        <?php
    }
    $num++;
} // end while(row)
}// end while(num)
?>

これは問題なく動作するようですが、MemCached に関する多くのチュートリアルが見つからないため (ほとんどが MemCache にあるようです)、これについて正しい方法で行っているのか、それともツールは完全に間違った方法で。キーの高さを追跡する最良の方法は何ですか? 現時点では、ロードする必要がある画像の数がわかっているため、4 つにハードコードしましたが、明らかにそれは正しい解決策ではありません。

私の使用法に関する批評と、推奨されるチュートリアルへのリンクを得ることができれば、それは素晴らしいことです! テーブルを使用して Web ページをレイアウトする memcached バージョンです。

4

1 に答える 1

0

キャッシュの使用法は非常に単純です。

  1. キャッシュをチェックしてアイテムを見つける
  2. 存在しない場合は、フェッチ (または作成) してキャッシュに入れます。
  3. アイテムを届ける

キャッシュを埋めるには 3 つの方法を考えることができ、キャッシュされるデータに応じて戦略を選択します (データの量、データの検索/準備にかかる時間、使用頻度、どれだけ「適切」か)。キャッシュできます)。

  • 一度に 1 つのアイテムを取得する
  • 一度に複数のアイテムを取得する
  • 一度にすべてのアイテムを取得する

最初の戦略は、データの作成にかなりの時間がかかり、データが「適切に」キャッシュ可能である (妥当な時間キャッシュに保持できる) 場合です。キャッシュ エントリの作成には時間がかかる場合があり、その後の呼び出しではキャッシュ内のデータが検出され、非常に高速になります。

2 番目の戦略は、キャッシュ可能なレコードが多く、妥当な時間内にサブセットを決定でき、データが頻繁に変更されない (「十分にキャッシュ可能」) 場合です。この戦略は、「この ID と次の 10 を取得します。これらはすぐに使用される可能性があるため」など、推定可能なアイテムのプリフェッチにも使用できます。

3 番目の戦略は、アイテムの数が少ないが頻繁にアクセスする場合に役立ちます。このようにして、データベースから多くの負荷を取り除きます (データが 1 分間に 1000 回使用されると想像してください。1 分間だけキャッシュすると、クエリの量が 1000 ではなく 1 に減少します)。アイテムがキャッシュから欠落している場合は常に、全体を更新してください。

あなたの場合には、戦略 3 をお勧めします。

目的のアイテムのキャッシュを確認します。存在しない場合は、レコードのリスト全体を取得し、すべてのアイテムに一意のキーを使用してすべてをキャッシュに入れます (要求されたアイテムを選択することを忘れないでください)。以降のルックアップでは、すべてのレコードがキャッシュから検出され、提供される必要があります。

于 2013-06-02T13:48:13.493 に答える