PHP中的memcached与内部缓存有何区别?

5

我正在处理一些使用PHP编写的旧软件,它通过维护一个$cache数组来减少SQL查询次数。我在考虑是否应该用memcached代替内部缓存。如果我保留内部缓存,仍然会有值得提高的性能吗?还是只使用memcached就足够了?


1
在您的应用程序范围内对不同方法进行基准测试,看看会发生什么。 - salathe
它是如何在页面间保持 $cache 数组的?它被序列化到文件中吗?还是存储在APC/Eaccelerator/Memcached/DB等中? - ircmaxell
看起来当前的方法是无用的,需要重新审视。一个脚本运行时中缓存有什么用?它看起来更像是缓存的真正需求而不是良好设计。 这个应用程序真的需要任何缓存吗? - Your Common Sense
ircmaxell,这是一个全局变量,没有封装,所以在代码中被引用了数千次...经过仔细查看,似乎这个全局$cache数组根本没有缓存,而是用于避免向函数传递过多的参数。糟糕! - bcoughlan
3个回答

5
根据这篇博客文章,PHP内置的数组比其他任何方法都要快:
Cache Type                Cache Gets/sec

Array Cache                       365000
APC Cache                          98000
File Cache                         27000
Memcached Cache (TCP/IP)           12200
MySQL Query Cache (TCP/IP)          9900
MySQL Query Cache (Unix Socket)    13500
Selecting from table (TCP/IP)       5100
Selecting from table (Unix Socket)  7400

1
我有很多类似数组的缓存。确实更快。然而,我正在慢慢引入 MemCache 有两个原因: 1)某些数组在其他脚本中以某种方式重复出现,使用 MemCache 可以统一它们。 2)尽管数组更快,它们会消耗内存,并且数组越大,占用的内存就越多。而 MemCache 速度足够快。**总之:对我来说,我已经决定使用 MemCache。有时我会暂时保留两者,并添加一个 TODO 注释,之后几周再删除数组。希望这可以帮到你。 - tanovellino
Redis也非常有趣,特别是具备将数据存储在磁盘上的能力,并且可以轻松地在多个服务器之间同步数据。 如果您想要使用PHP实现真正的高性能,那么我建议您尝试一下Swoole。任何缓存页面都能获得极低的响应时间(在我的电脑上,Redis缓存HTML页面在Swoole环境下仅需约2毫秒加载,而在传统的PHP 7中需要约10毫秒 - 在这两种情况下,服务器均为h2o,页面在Firefox中加载)。 - István Ujj-Mészáros

4
似乎memcache(在底层实现)比一些php解释缓存方案更快。
然而:如果没有问题,就不要去修复它。
如果你删除自定义缓存代码,你可能需要处理依赖于缓存的其他代码。我无法评估你需要维护的代码质量,但这似乎是那些“可能不值得”的事情之一。
让我这样说:你相信原始开发者编写的代码是否仍能在你移除缓存时正常工作吗?(我可能不会)
因此,除非现有的缓存存在问题,否则建议不要将其删除。

3
你怎么判断Memcache比解释型系统(总体上)更快呢?这涉及TCP通信... Memcache比查询数据库更快,因为它们都会访问网络,但不一定比从磁盘读取php文件更快($foo = include('myfoofile.php');其中myfoofile.php包含 <?php return array('blah','blah','blah');)。两者都需要分配内存,但只有php文件可以利用本地opcode缓存... - ircmaxell
很好的建议...情况是主要开发人员已经离开,留下了一堆未记录的代码给我(新手!)。缓存根本没有封装,它是一个全局变量,在代码中被引用了数千次,真正影响了可读性,并且散发着糟糕的设计气息,所以从架构角度来看(在我看来!)它是有问题的 :-) - bcoughlan
@ircmaxell:我假设两者都会访问网络,因为他的问题涉及到数据库访问。 - Kris

1
如果满足以下条件,使用memcache比本地缓存具有优势:
1)您有多个网页服务器从同一数据库运行,并且已设置memcache以跨多个节点运行。
2)数据库没有实现查询结果缓存或访问非常缓慢。
否则,除非缓存代码非常差,否则不应期望看到太多的性能提升。
希望对您有所帮助。
C.

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