2

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

由于多种原因,我不得不(迟来的)实现 Memcache。我已经开始弄清楚了,但想确认一件事。

我希望对超时的默认值进行修改。它会查看它是否在内存缓存中,如果没有 - 进行查询并存储它。

但是,您似乎无法存储 mysqli 结果(通过此问题)。这是否意味着您不能在应用程序中使用 $db->fetch_assoc() 或任何其他通用对象使用的任何代码?

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

4

3 回答 3

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 对象,那么您还有更多工作要做。

于 2012-06-20T17:03:52.267 回答
5

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

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

但是,作为一项规则,当您缓存结果时,您总是希望在缓存结果之前尽可能多地对结果进行处理、过滤和其他操作,这样当您从缓存中检索数据时,您不必总是在之后立即重复相同的处理步骤。

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

于 2012-06-20T17:26:39.647 回答
3

您不能在 memcache 中存储任何依赖资源的内容。

页面结束时会丢弃资源,无论是否已缓存。您的 mysqli 结果是一个对象,但依赖于使用的资源。它提供了一种干净的 OOP 方法来浏览资源,并且该对象可能可以存储在 memcache 中,但是当页面结束时资源标识符将被删除......

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

祝你好运

于 2012-06-20T17:23:34.310 回答