如何使用memcache缓存mysql_query?

Roc*_*och 2 php mysql memcached

我想知道是否可以在memcache中存储"ressource",我现在正在尝试以下代码,但显然它不正确:

$result = mysql_query($sSQL);
$memcache->set($key, $result, 0, $ttl);
return $result;
Run Code Online (Sandbox Code Playgroud)

Lès*_*sté 9

我不同意zerkms.仅仅因为MySQL有一个缓存系统(实际上,它有几个),并不意味着优化数据库访问没有任何好处.MySQL的查询缓存很棒,但它仍然有局限性:

  • 它不适合大型数据集
  • 查询必须相同(字符的字符)
  • 它不支持使用用户定义的函数,临时表或具有列级特权的表的预准备语句或查询
  • 无论结果集是否受到影响,每次修改表时都会清除缓存结果
  • 除非它与Web服务器驻留在同一台机器上,否则仍会产生不必要的网络开销

即使使用远程服务器,Memcached也比MQC快大约23%.使用APC的对象缓存,与单独使用MQC相比,您可以获得高达990%的改进.

因此,有很多理由将数据库结果集缓存在MySQL的查询缓存之外.毕竟,当您需要在同一个脚本中多次访问结果数据时,可以在PHP变量中本地缓存结果数据.那么,如果结果集没有改变,为什么不在多个请求中扩展它呢?

而且仅仅因为服务器足够快并不意味着你不应该努力编写有效的代码.缓存数据库结果并不需要花费太多精力 - 尤其是当APC和Memcached等加速器专为此目的而设计时.(当互联网上一些最大的网站将Memcached与MySQL结合使用时,我不会将这个问题视为一个"奇怪的想法" .)

也就是说,zerkms是正确的,你必须首先获取结果,然后你可以使用APC或Memcached缓存数据.但是,还有另一种手动缓存查询结果的选项,即使用Mysqlnd查询结果缓存插件.这是MySQL查询结果的客户端缓存.

Mysqlnd查询结果缓存插件允许您使用APC,Memcached,sqlite或用户指定的数据源透明地缓存查询.但是,此插件目前与MQC具有相同的限制,因为无法缓存预准备语句.