【问题标题】:Using APC to store data in arrays使用 APC 将数据存储在数组中
【发布时间】:2011-05-03 02:40:56
【问题描述】:

我目前正在尝试将 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]') 之类的东西。

我该如何设计这个?

我假设我需要序列化数据?

【问题讨论】:

  • 啊,太棒了。在我的谷歌搜索中没有看到:/
  • 我不知道这些文章是否对您的问题有帮助,但我觉得它们是很好的一般信息,所以我想我会分享它们。

标签: php arrays store apc fetch


【解决方案1】:

我真的不知道你缓存架构,所以回复不能准确。 首先:记住 APC 使用服务器的共享内存,在这种情况下,如果您有多个服务器,它们都将至少获取一次 db 以获取数据。 如果您尝试存储每列,则需要确保创建某种锁,否则您将遇到竞争条件,因为当您保存一列时,其他任何可能都会改变。 我建议您完全保存该行,只需这样做:

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

但另一方面,这意味着如果您有 1000 篇文章,您会将它们保存在缓存中,并且其中许多可能根本没有被阅读。

在这种情况下,我建议您使用lazy loading

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

这样你只缓存经常被点击的内容。

另一方面,请与您的cache invalidation保持一致,以避免缓存中有旧数据。

【讨论】:

  • 如果我尝试使用它,我收到错误:不能使用 mysqli_result 类型的对象作为数组。使用代码:foreach ($row = $db-&gt;query("SELECT * FROM pages_content") as $key) { $key = 'content_' . $row['id']; apc_store($key, $row); }
  • 我猜你需要使用$result-&gt;fetch_assoc()
猜你喜欢
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
相关资源
最近更新 更多