Memcache - 存储mysql结果

时间:2012-06-20 16:57:05

标签: php mysql memcached

我有一个数据库类,它管理我的应用程序的所有mysql连接。

由于种种原因,我不得不(姗姗来迟)实施Memcache。我已经开始想出来,但想确认一件事。

我希望在超时默认情况下对类进行修改。它会看到它是否在memcache中,如果没有 - 进行查询并存储它。

然而,好像你无法存储mysqli结果(via this question)。这是否意味着您不能在应用程序中使用$ db-> fetch_assoc()或任何其他常规对象使用的任何代码?

如果是这样,这是否意味着我们正在全面谈论代码变更?在我把头放在手中之前,我想确认一下。

3 个答案:

答案 0 :(得分:6)

您无法存储结果对象,但是您可以将所有行提取到数组中并存储该数组。如果您需要在其他地方重构代码取决于您编写代码的方式以及您之前提取数据库访问权限的程度。

例如,如果你有这样的函数:

function database_result($query) {
   ...
   $result_array = $result->fetchAll();
   return $result_array;
}

然后你可以在该函数中添加Memcached缓存:

function database_result($query, $expire = 60) {
   $memcached_key = 'db:' . $query;
   $cached = $memcached->get($memcached_key);
   if ($memcached->getResultCode() !== Memcached::RES_NOTFOUND) {
       return $cached;
   }
   ...
   $result_array = $result->fetchAll();
   $memcached->set($memcached_key, $result_array, $expire);
   return $result_array;
}

如果您在任何地方使用原始PDO或MySQLi对象,那么您还有更多工作要做。

答案 1 :(得分:5)

Memcache存储字符串,而不是结构。您必须能够将结构序列化为字符串以存储它们,并将它们反序列化为结构以检索它们。

这比听起来简单,因为PHP提供了一组函数来执行此操作。请参阅:http://php.net/manual/en/function.serialize.php

但是,通常,当您缓存结果时,您总是希望对结果执行尽可能多的处理,过滤和其他操作,就像在缓存结果之前一样,当您从结果中检索数据时缓存,您不必总是立即重复相同的处理步骤。

另外请记住,MySQL已经有了内置的查询缓存。如果你所做的只是根据查询字符串盲目地存储查询结果,那么你只是复制功能。如果您希望显着提升性能,则需要在某处“增加价值”,利用您对应用程序的了解,将应用程序对象缓存在比数据库查询结果更高的级别。

答案 2 :(得分:3)

您无法存储依赖于memcache中资源的任何内容。

页面结束时,资源被删除,memcached与否。你的mysqli结果是一个对象,但依赖于一个资源来使用。它提供了一个干净的OOP方法来浏览资源,该对象可能存储在memcache中,但是当页面结束时资源标识符将被删除...

在memcache中存储mysql(i)数据的唯一方法是循环它并将其放入数组中,标量数据或对象数据不会改变任何内容并存储该数据数组,而不是mysqli结果。

祝你好运