什么时候应该使用Memcache而不是Memcached?

332
似乎PHP有两个名为memcachememcached的memcached库。它们有什么区别,如何确定使用哪一个?其中一个是否已过时?似乎memcached提供了更多的方法,所以我会认为这意味着它有最多的开发 - 但它似乎还需要外部C/C++库,所以我不确定是否可以安装它。
似乎memcache存在更长时间,不需要额外的库,并且甚至有预编译的二进制文件供Windows使用!我认为现在它可能是更好的选择。然而,作为memcached(服务器)的新手,我不确定memcached(PHP)中是否有一些非常重要的功能,这使得它值得额外的麻烦。

1
ZendCon有一期很棒的节目比较了两者。ZendCon Sessions Episode 040: Memcached: the better Memcache interface - John Magnolia
这篇文章与http://serverfault.com/questions/63383/memcache-vs-memcached相似,只是发布时间晚了几天,但它获得了更多的浏览量和投票 :) - Stefano
4个回答

255

Memcached客户端库最近已发布为稳定版。它由Andrei Zmievski为digg开发(现已不再与digg合作),实现了比旧版memcache客户端更多的memcached协议。Memcached最重要的功能包括:

  1. Cas tokens。这使我的生活变得更加轻松,是一种易于预防过期数据的系统。每当您从缓存中提取某些内容时,您可以获得一个cas令牌(双重数字)。然后,您可以使用该令牌保存更新的对象。如果在您的线程运行时没有其他人更新该值,则交换将成功。否则,会创建一个更新的cas令牌,您需要重新加载数据并使用新令牌再次保存数据。
  2. 通读callbacks是自面包切片以来最好的东西。它简化了我的大部分代码。
  3. getDelayed()是一个很好的功能,可以减少脚本等待服务器返回结果的时间。
  4. 虽然memcached服务器被认为非常稳定,但速度却不是最快的。你可以使用新版本的客户端使用二进制协议而不是ASCII。
  5. 每当您将复杂数据保存到memcached中时,客户端以前总是对值进行序列化(这很慢),但现在使用memcached客户端,您可以选择使用igbinary。到目前为止,我还没有机会测试这可以带来多少性能提升。
所有这些因素足以让我转换到最新的客户端,我可以告诉你它运行得非常好。虽然有libmemcached库的外部依赖,但我已经设法在Ubuntu和Mac OSX上安装它,所以到目前为止没有问题。
如果您决定更新到较新的库,我建议您同时更新到最新的服务器版本,因为它也具有一些不错的功能。您需要安装libevent才能进行编译,但在Ubuntu上并不麻烦。
我还没有看到任何框架迄今采用了新的memcached客户端(尽管我没有跟踪它们),但我认为Zend很快就会加入进来。
更新
Zend Framework 2有一个适配器可用于Memcached,可以在此处找到。

1
非常好的答案;此外,对于这种情况,libmemcached的外部依赖实际上是一个加分项,因为它是更活跃开发的客户端之一。 - Marc Bollinger
1
那个 Cas Tokens 看起来像是最大的优点。实际上,从这些特性的概述来看,似乎 memcached 正朝着一个托管数据持有者(类似于数据库)的方向发展,而不是临时缓存的方向。 - Xeoncross
8
这个回答甚至没有说明 memcache 和 memcached 之间的区别?!memcache 只是 memcached 的旧版本吗? - Daniel W.
CakePHP将在v2.5中支持它。 - Calin
@DanFromGermany 为什么不呢?它清楚地说明了_memcached_的来源和原因,以及它除了_memcache_之外的_特性_,描述了_新的依赖关系_并总结了建议使用它。 - Lukas
显示剩余4条评论

10
使用 Windows 时,比较简单:似乎只有 memcache 客户端可用。

你不能自己添加 memcached 扩展吗? - Pacerier
1
这似乎并不是真的。https://commaster.net/content/installing-memcached-windows - Joe Leonard
从您链接的页面中可以得知,要在PHP中与memcached进行接口交互,您需要安装PHP的memcache扩展。 - rymo
Memcached也可以在Windows上使用,但是在2009年提问时可能还没有这个功能。 - Jeff Clayton

8

Memcached是一个较新的API,它还提供了作为会话提供者的memcached,如果你有一组服务器,这将是非常好的选择。

虽然版本号仍然很低(0.2),但我已经使用过两种方案,并没有遇到重大问题,所以我会选择memcached,因为它更加先进。


1
两者实际上都可以作为会话处理程序,尽管我永远不想使用它们来做这件事。http://us3.php.net/manual/en/memcache.examples-overview.php - Xeoncross
抓得好,我的错。是的,在大型服务器上,当IO变得非常重要时,它才真正有用。此外,Memcache不验证它是否会删除某些对象以获得内存,因此很难知道如何扩展事物。 - RageZ
2
0.2版本已被稳定的1.0.0版本所取代。 - Miha Hribar
目前版本为1.6.17。 - Melroy van den Berg

6

现在是2013年,忘记2009年的评论吧。如果你需要处理大量流量,请不要考虑如何使用基于Windows的memcache。

当处理极大规模(500+前端Web服务器)和20+后端数据库服务器和复制品(MySQL和MSSQL混合)时,一组memcached服务器(12台服务器)支持多个高容量OLTP应用程序,每秒回答25K〜40K mc-> get调用。这些调用不必到达数据库。

我认为,这种使用memcached为新DB服务器和许可证以及大型商业设计的支持合同带来了严重的$$$,$$$节省。


55
这如何回答关于php中memcache协议这两个实现之间的差异的问题? - Marki555
10
这应该是一个评论。 - Elijah Lynn

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