1

我目前正在尝试将 APC 缓存实现为我的 Web 应用程序中的数据存储。

目前,系统直接从 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 使用服务器的共享内存,在这种情况下,如果您有多个服务器,它们都将至少获取一次 db 以获取数据。如果您尝试存储每列,则需要确保创建某种锁,否则您将遇到竞争条件,因为当您保存一列时,其他任何可能都会改变。我建议您完全保存该行,只需执行以下操作:

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