【问题标题】:Memcache - storing mysql resultsMemcache - 存储 mysql 结果
【发布时间】:2012-06-22 21:05:23
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您可以存储一个包含结果的对象(例如:stdClass),但不能存储mysqli_result 对象。使用缓存时也要小心。不要过度使用它,否则它会使它变得无用。

标签: php mysql memcached


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      祝你好运

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-31
        • 2013-08-05
        • 1970-01-01
        • 2016-04-03
        相关资源
        最近更新 更多