单服务器站点数据缓存:Memcache vs APC

28

我有一个单服务器站点,每天推送约200,000个独立访问者,并且流量每40天就会翻一倍(在过去5个月中是这样的)。

我的计划几乎只是将mysql_query函数的输出缓存一小时左右。如果缓存超过一个小时,则运行查询,将结果放回缓存中再缓存一个小时。

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

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

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

我想实现一个缓存系统,并想知道哪种更快。很想看到一些基准测试结果。


3
+1,这个问题帮了我,谢谢stackoverflow。 - Imran Naqvi
6个回答

35

快速搜索显示,APC比Memcached快5倍。

我的经验表明,APC几乎比Memcached快7-8倍。但是,如果您需要通过不同的服务访问缓存(例如,如果您主要在Apache上运行,并将一些流量委派给另一个Web服务(例如Lighttpd)处理静态内容,如图像或纯HTML),那么Memcached可能非常有用,甚至必不可少。

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


+1,我没有提出新问题,因为那将是重复的。感谢@DaNieL,你的答案就是我的解决方案。 - Imran Naqvi
1
请问您能提供Google说这句话的链接吗?先谢谢了。 - Gerry
@Gerry:通过“谷歌说……”,我指的是在谷歌搜索中的第一个结果。 - Strae
2
当我们将不需要分布式的查询从Memcached切换到APC时,我们注意到执行时间显著下降。因此,如果您只需要本地访问,则我们建议使用APC。 - anonymous-one
@Strae,我读过一些博客文章声称APC的基准测试速度比较快,可以快30倍。 - Pacerier

9

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

  • opcode缓存可缓存php脚本的已编译字节码。您可以在此处查看基准测试结果(尽管这是一篇较旧的文章):http://itst.net/654-php-on-fire-three-opcode-caches-compared 注意:我强烈建议使用opcode缓存。

  • 缓存用户数据 - APC和其他工具可以实现此功能。这将是您的参考数据或数据,这些数据相当静态且不经常更改。您可以每天清除缓存,或者在此参考数据更改时触发清除缓存。这也是强烈推荐的,因为通常参考数据经常使用且不经常更改。

  • 缓存sql查询 - 我知道Zend通过简单的设置使此任务变得容易。由于这些查询不会更改,因此这是另一个明显的选择(如您所提到的)

附加内容(如果可能):

  • 缓存html页面 - 显然,缓存静态页面比生成页面更快,但通常很难实现,因为应用程序中的大多数页面都是如此动态。如果您可以做到这一点,那么它是值得的,尽管如果您的查询被缓存并且您的SQL很简单,我不会重点关注这一点。

  • 缓存sql结果 - 我个人不推荐这样做。我会让数据库做其最擅长的工作,因为DBMS通常具有缓存功能。我可能会为执行线程缓存结果(即,我刚刚检索了这个,所以不要再次执行),但我不会超出这个范围。

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


我不确定我理解SQL查询缓存和SQL结果缓存之间的区别。为什么我不想要缓存它呢? - user15063
1
Sql查询缓存是缓存sql语句(例如,从帐户中选择信用额度,其中id =?)-这些语句不会改变。该查询的结果可能为$200.00,但该金额可能根据您处理的数据类型而更改。通常,查询只有“几个”,与可能的结果相比较少。 - Arthur Frankel
以下是来自Doctrine (ORM)的解释 - http://www.doctrine-project.org/documentation/manual/1_0/en/caching - Arthur Frankel

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

8
你想比较APC键值存储和Memcache,因为APC还可以进行opcode缓存,这是一种不同的东西。
在单台机器上,APC k-v缓存比memcache快得多。Memcache具有更多功能,但仅适用于分布式环境,而APC仅适用于单个服务器。
我最近进行了基准测试,在两者中设置并获取100万个密钥,每个密钥都是连续的整数,值是32字节的字符串。
通过localhost,memcache可以在单线程中检索12k个密钥/秒。APC返回90K/秒。但是,如果您使用多线程或“multi_get”与memcache,则可以接近APC性能。
基准测试在slicehost的1GB vps上运行。

3

准确预测哪个更快几乎是不可能的。我建议在开发环境中使用相似数据对两者进行测试。

当性能很重要时,一定要使用分析工具。


这是一个标准的懒惰回答。实际上,准确预测哪个更快是可能的。请注意,我们不关心更快多少,我们只关心哪个更快。 - Pacerier

1

我使用带有APC的IPB 3.1.4,它比没有APC时快了两倍。

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

暂时不要使用memcached测试IPB


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接