【发布时间】:2011-06-23 08:24:30
【问题描述】:
我想知道是否可以在内存缓存中存储“资源”,我目前正在尝试以下代码,但显然它不正确:
$result = mysql_query($sSQL);
$memcache->set($key, $result, 0, $ttl);
return $result;
【问题讨论】:
-
资源无法缓存,查询结果... YES
我想知道是否可以在内存缓存中存储“资源”,我目前正在尝试以下代码,但显然它不正确:
$result = mysql_query($sSQL);
$memcache->set($key, $result, 0, $ttl);
return $result;
【问题讨论】:
我不得不不同意 zerkms。仅仅因为 MySQL 有一个缓存系统(实际上,它有几个),并不意味着优化您的数据库访问没有任何好处。 MySQL 的 Query Cache 很棒,但它仍然有局限性:
即使使用远程服务器,Memcached is roughly 23% faster than MQC。并且使用 APC 的对象缓存,与单独使用 MQC 相比,您可以获得高达 990% 的改进。
所以有很多理由在 MySQL 的查询缓存之外缓存数据库结果集。毕竟,当您需要在同一脚本中多次访问结果数据时,您会将结果数据本地缓存在 PHP 变量中。那么,如果结果集没有改变,为什么不将其扩展到多个请求呢?
仅仅因为服务器足够快并不意味着您不应该努力编写高效的代码。缓存数据库结果并不需要付出太多努力——尤其是当 APC 和 Memcached 等加速器专为此目的而设计时。 (当some of the largest sites on the internet use Memcached in conjunction with MySQL 时,我不会认为这个问题是一个“奇怪的想法”。)
也就是说,zerkms 是正确的,因为您必须先获取结果,然后才能使用 APC 或 Memcached 缓存数据。然而,还有另一种手动缓存查询结果的选项,即使用Mysqlnd query result cache plugin。这是 MySQL 查询结果的客户端缓存。
Mysqlnd 查询结果缓存插件允许您使用 APC、Memcached、sqlite 或用户指定的数据源透明地缓存您的查询。但是,这个插件目前与 MQC 有相同的限制,即无法缓存准备好的语句。
【讨论】:
你为什么需要这个? Mysql有自己的性能 query cache
但如果您仍然想遵循您的奇怪想法 - 您需要将所有数据提取到数组中(使用 mysql_fetch_assoc 或其他),然后将该数组存储到 memcached 中。
【讨论】: