1

現在、WebアプリケーションのデータストアとしてAPCキャッシングを実装しようとしています。

現在、システムはMySQLデータベースから直接データを取得し、リクエストごとにデータベース呼び出しを必要とします。

私は現在、リクエストごとにインターセプトされてキャッシュから提供されるデータをキャッシュに事前入力することで、これを変更しようとしています。

現在の方法は次のとおりです。

if(!empty($_GET['id'])){        

        $app = $db->real_escape_string($_GET['id']);
        $result = $db->query("SELECT * FROM pages_content WHERE id = $app");
        $rawdata = $result->fetch_assoc();

}

データは、次の出力によって表示されます。

$title = stripslashes($rawdata['title']);
$meta['keywords'] = stripslashes($rawdata['htmlkeywords']);
$meta['description'] = stripslashes($rawdata['htmldesc']);
$subs = stripslashes($rawdata['subs']);
$pagecontent = "<article>".stripslashes($rawdata['content'])."</article>";

事前入力スクリプトで実行する必要があるのは、データテーブル内のデータの各行に対して、各行のデータをキャッシュすることです。サービングスクリプトは、必要に応じて、などを使用してキャッシュからデータを取得できるようになりますapc_fetch('[columname][id]')

どうすればこれを考案できますか?

データをシリアル化する必要があると思いますか?

4

1 に答える 1

1

私はあなたがスキーマをキャッシュしていることを本当に知らないので、応答は正確ではありません。まず、APCはサーバーの共有メモリを使用することを忘れないでください。この場合、複数のサーバーがある場合、それらはすべて、データを取得するために少なくとも1回はデータベースをフェッチします。列ごとに保存しようとする場合は、必ず何らかのロックを作成する必要があります。そうしないと、列を保存しているときに他の列が変更される可能性があるため、競合状態が発生します。私がお勧めするのは、行を完全に保存することです。

<?php
foreach ($row = $mylsql->get_row()) {
  $key = 'content_' . $row['id'];
  apc_store($key, $row);
}

しかし一方で、1000の記事がある場合は、それらをキャッシュに保存し、それらの多くはまったく読み取られない可能性があることを意味します。

その場合は、遅延読み込みを使用することをお勧めします:

<?php
$id = $_GET['id'];
$key = 'content_' . $id; 
$data = apc_fetch($key);
if (!is_array($data)) {
  // call mysql here
  $data = $mylsql->get_row();
  apc_store($key, $data);

}

// your script here using $data

このようにして、頻繁にヒットするコンテンツのみをキャッシュします。

一方、キャッシュに古いデータが含まれないように、キャッシュの無効化と一貫性を保つようにしてください。

于 2010-10-31T16:44:59.787 に答える