php - 缓存 MySQL 结果集

标签 php mysql memcached apc

我需要一个在 APC 缓存中存储 MySQL 结果集的工作代码!
我在 Google 和 SO 上进行了搜索,但没有找到任何内容!
希望有人能分享一个工作代码。

示例:

$stmt=mysqli_prepare($con,"SELECT UID FROM Users");
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $UID);
mysqli_stmt_fetch($stmt);
mysqli_stmt_close($stmt);

示例 2:

$stmt=mysqli_prepare($con,"SELECT Events FROM Calendar where UID=?");
mysqli_stmt_bind_result($stmt, "i",$UID);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $events);
while(mysqli_stmt_fetch($stmt))
{
   ...
}
mysqli_stmt_close($stmt);

如何将输出的 SQL 结果存储在 APC 中?

我想知道在 APC 中缓存它的代码(而不是在 MySQL 中)

最佳答案

你可能真的不想这样做!

向您的应用程序添加缓存层应该是您最后要做的事情之一。缓存可以发现代码中的大量错误,这些错误既微妙又明显。

如果你想提高代码的性能,你应该 performing code profiling 并消除真正的瓶颈,而不是感知到的瓶颈。

尤其是在这种情况下。

此处的示例查询很糟糕。可怕的,甚至。您正在从表中的每一行 中获取 UID 列,但未能为这些行指定顺序,然后实际上只获取第一行,无论它是什么.

即使使用 这个查询,甚至不考虑缓存它,都是危险的。 如果它是一个真正的查询,那么您的代码一开始就损坏!保证从数据库返回的结果是按任何特定顺序排列的.实际上,至少对于 MySQL,您实际上可以使用 ALTER TABLE ... ORDER BY重置磁盘上的数据排序 .如果您只需要一行,您应该使用 ORDER BY 子句和 LIMIT 子句,而不是选择所有 然后只获取一行.

我将假设您已经过度简化了查询 作为示例,并且会用两三个快速入门来取悦您 APC你需要知道的功能。您应该阅读所有其他函数的手册页,以了解 APC 的工作原理。

让我们看看您的代码。

$stmt=mysqli_prepare($con,"SELECT UID FROM Users");
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $UID);
mysqli_stmt_fetch($stmt);
mysqli_stmt_close($stmt);

在此代码中,您正在准备查询SELECT UID FROM Users,将结果集的第一列绑定(bind)到 PHP 变量 $UID,获取单行,然后关闭语句句柄(丢弃所有其他结果)。

$UID 包含您要缓存的单个值。要在 APC 中缓存此值,您可以使用 apc_store :

apc_store($key, $UID);

$key 是缓存键名。

当然,把它放在缓存中是愚蠢的,比如,只在需要时查询数据库。我们可以使用 apc_fetch首先查找缓存的值。

$value_in_cache = false;
$value = apc_fetch($key, $value_in_cache);
if(!$value_in_cache) {
    $value = null;
    $stmt = mysqli_prepare($con,"SELECT UID FROM Users");
    mysqli_stmt_execute($stmt);
    mysqli_stmt_bind_result($stmt, $value);
    mysqli_stmt_fetch($stmt);
    mysqli_stmt_close($stmt);
    apc_store($key, $value);
}

此代码将始终尝试在查询数据库之前将 $key 从缓存中拉出,这很可能是您想要完成的。请注意,我在这里故意省略了缓存过期时间。

你会注意到这里显然只有一个值被缓存了。如果您坚持使用绑定(bind)结果变量,那么您将需要手动构建一个数组并缓存该数组。我强烈建议不要使用绑定(bind)变量。看看使用 mysql_stmt_get_result获取 result set ,然后您可以从中获取一个数组。 注意,手册上说get_result 返回 bool 值,但它在示例代码中返回了一个结果集对象。 YMMV。我可以建议 PDO为你 future 的项目?

无论使用什么数据库接口(interface),您都不能缓存实际的语句句柄或结果集对象,只能缓存它们返回的数据。

关于php - 缓存 MySQL 结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5828361/

相关文章:

caching - 相当于 Memcached 中的 Redis 哈希?

php - 检查 2 个数组是否至少有 1 个相等的值

php - 查询变量不起作用

php - 在 Jquery 中,如何提醒 JSON 对象的一部分?我得到 "undefined"

mysql - Prestashop - MySql 更新查询脚本不工作

通过 Memcache 的 Django session : Cannot find session key manually

php - 使 PHP 计算器存储和显示历史记录

mysql - PDO 而不是 MYSQL 函数

php - 在选择选项中显示两个表选择值

database - CMS 数据库设计 - 每个站点的主数据库或多数据库