【发布时间】:2011-02-05 19:30:02
【问题描述】:
我试图了解使用 memcached 之类的解决方案需要什么。这似乎是一个愚蠢的问题 - 但如果我只需要缓存对象,它会带来什么?不是一个简单的哈希图吗?
【问题讨论】:
我试图了解使用 memcached 之类的解决方案需要什么。这似乎是一个愚蠢的问题 - 但如果我只需要缓存对象,它会带来什么?不是一个简单的哈希图吗?
【问题讨论】:
引用memcache web site,memcache 是……
免费和开源,高性能, 分布式内存对象缓存 系统,本质上是通用的,但是 用于加速 动态网络应用程序 减轻数据库负载。
Memcached 是内存中的键值对 存储小块任意 结果中的数据(字符串、对象) 数据库调用、API 调用或页面 渲染。 Memcached 很简单 强大的。其简单的设计促进 快速部署,易于开发, 解决了很多大问题 数据缓存。它的 API 可用于 最流行的语言。
本质上它是一个简单的键/值 商店
这里的一个关键词是分布式。一般来说,再次引用 memcache 站点,
Memcached 服务器通常是 彼此不知情。没有 串扰,无同步,无 广播。缺乏 互连意味着增加更多 服务器通常会增加更多容量 如您所料。可能有 这条规则的例外,但它们是 例外并仔细考虑。
我强烈推荐阅读detailed description of memcache。
【讨论】:
你打算把这个哈希图放在哪里?这就是它为你做的事情。您在 PHP 上实现的任何结构都只存在于请求结束之前。如果您将内容放入持久缓存中,则可以将其取回以供其他请求使用,而不是重建数据。
【讨论】:
我知道这个问题比较老了,但是除了能够跨多个服务器共享缓存之外,还有另一个方面在其他答案中没有提到,那就是值过期。
如果您将值存储在 HashMap 中,并且该 HashMap 绑定到应用程序上下文,它将不断增长,除非您以某种方式使项目过期。 Memcached 延迟对象过期以获得最佳性能。
当一个项目被添加到内存缓存时,它可以有一个过期时间,例如 600 秒。对象过期后它会一直保留在那里,但如果另一个对象请求它,它将清除它并返回 null。
类似地,当 memcached 内存已满时,它会寻找第一个足够大小的过期项并将其过期以为新项腾出空间。最后,也可能发生缓存已满且没有任何项目过期的情况,在这种情况下,它将替换最少使用的项目。
【讨论】:
使用完全标记的缓存系统通常允许您在多台服务器上复制缓存,或者只是扩展到多台服务器以扩展大量并行请求,所有这些在回复方面仍然可以接受。
【讨论】:
有一篇(旧)文章比较了 php 使用的不同缓存系统: https://www.percona.com/blog/2006/08/09/cache-performance-comparison/
基本上,文件缓存比 memcached 快。
所以要回答这个问题,我相信使用基于文件的缓存系统会有更好的性能。
以下是文章的测试结果:
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
【讨论】: