Memcache vs APC用于单个服务器站点数据缓存

时间:2009-11-25 02:50:57

标签: php caching memcached

我有一个服务器站点,每天推送200k unqiues,流量大约每40天翻一番(过去5个月)。

我几乎只计划将mysql_query函数的输出缓存一个小时左右。如果缓存早于该缓存,请运行查询,将结果重新放回缓存中一小时。

我的mysql数据库大小约为200mb(每月增长10-20mb)。

我通过编写HTML输出并使用它们几分钟来完成大量文件缓存,然后重新生成html。

不幸的是,由于它是一个数据库站点,它允许许多排序,搜索和排序方法,以及分页....有超过150,000个缓存页面。我也没有缓存搜索查询,这会导致大部分负载。

我想实现一个缓存系统,我想知道哪一个更快。很想看到一些基准。

6 个答案:

答案 0 :(得分:34)

A quick Googling表示APC比Memcached快5倍。

我的经验表明APC比Memcached快近7-8倍......但是,memchached可以被不同的服务访问(例如,如果你主要运行apache并委托一些流量,例如静态内容,如图像或纯html,对于另一个像lighttpd这样的网络服务,如果不是必不可少的话,它真的很有用。

APC的功能少于memcached,易于使用和优化,但这取决于您的需求。

答案 1 :(得分:9)

就像你提到的那样,缓存有几个不同的方面。我可能会关注你的php应用程序中缓存的以下几个方面:

  • 操作码缓存,用于缓存php脚本的编译字节码。你可以在这里看到一个基准(虽然是一篇较旧的文章):http://itst.net/654-php-on-fire-three-opcode-caches-compared 注意:我强烈建议使用操作码缓存。

  • 缓存用户数据 - APC和其他人这样做。这将是您的参考数据或相当静态且不经常更改的数据。您可以每天清除缓存,或在此参考数据更改时触发干净缓存。这也是强烈建议的,因为通常使用参考数据并且不经常更改。

  • 缓存SQL查询 - 我知道Zend通过简单的设置简化了这项任务。由于这些查询没有改变,这是另一个明显的(如你所提到的)

附加(如果可能):

  • 缓存html页面 - 显然缓存静态页面比生成页面更快,并且通常这很难做到,因为应用程序中的大多数页面都是如此动态。值得一提的是,如果您可以执行此操作,但如果您的查询被缓存且您的SQL很简单,我就不会专注于此。

  • 缓存sql结果 - 我个人远离这个。由于DBMS通常具有缓存功能,因此我将让数据库完成其工作以及它最擅长的工作。我可以缓存执行线程的结果(也就是说,我只是检索了这个,所以不要再这样做了)但是我没有那么做。

我已成功使用APC和eAccelerator(我个人喜欢使用APC,它假设我的参考数据和SQL查询的操作码缓存和用户数据缓存)。使用XDebug来分析您的代码。

答案 2 :(得分:8)

您想比较APC键值存储与Memcache吗?因为APC也会执行操作码缓存,这是另一回事。

好吧,在一台机器上,APC k-v缓存比memcache快。 Memcache具有更多功能,但适用于分布式环境,而APC仅适用于单个服务器。

我最近做了一个基准设置然后在两者中获得了100万个密钥,每个密钥都是一个顺序整数,值是一个32字节的字符串。

通过localhost,memcache可以在一个线程中检索12k键/秒。 APC返回90K /秒。但是,如果您使用多线程或“multi_get”与memcache,它将非常接近APC性能。

基准测试在slicehost上以1GB vps运行。

答案 3 :(得分:8)

在我的情况下,apc比memcache快59倍

<?php
ini_set('apc.enable_cli','1'); //if u run in cli you may need to do changes in php.ini
error_reporting(E_ALL);
$mem=new Memcache();
$mem->connect('127.0.0.1',11211);
$mem->replace('testin','something');
$i=0;
$time=time()+microtime();
apc_store ( 'testin','something');
$num=1000000;
while($i<$num){
 $mem->get('testin');
$i++;
}
echo "memcache took: ",time()+microtime()-$time," for 1 million gets","\n";
$time=time()+microtime();
$i=0;
print_r(apc_fetch('testin'));
while($i<$num) {
apc_fetch('testin');
$i++;
}
echo "apc took: ",time()+microtime()-$time,"for 1 million gets \n";

这是输出

memcache took: 37.657398939133 for 1 million gets
somethingapc took: 0.64599800109863for 1 million gets

答案 4 :(得分:3)

几乎不可能准确预测哪个会更快。我会在具有类似数据的开发环境中运行测试。

当性能很重要时,请始终使用分析器。

答案 5 :(得分:1)

我将IPB 3.1.4与APC一起使用,它的工作速度比没有APC快两倍。

Requests per second:    43.46 [#/sec] (mean)
Requests per second: 24.23 [#/sec] (mean)

不要使用memcached测试IPB