Использование APC для хранения данных в массивах - PullRequest
1 голос
/ 31 октября 2010

В настоящее время я пытаюсь реализовать кэширование 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]').

Как я мог придумать это?

Я полагаю, мне нужно сериализовать данные?

1 Ответ

1 голос
/ 31 октября 2010

Я действительно не знаю, как вы кешируете схему, поэтому ответ не может быть точным.Во-первых: помните, что APC использует разделяемую память сервера, и в этом случае, если у вас несколько серверов, все они будут получать по крайней мере один раз базу данных для получения данных.Если вы пытаетесь сохранить для каждого столбца, вы должны быть уверены, что создали какую-то блокировку, иначе у вас будут условия гонки, поскольку, возможно, при сохранении столбца любой другой может измениться.Я рекомендую вам полностью сохранить строку, выполнив:

<?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

таким образом, вы кэшируете только тот контент, который часто поражается.

С другой стороны, пожалуйста, следуйте вашему аннулированию кэша , чтобы избежать хранения старых данных в кэше.

...