为什么要使用Memcached而不是HashMap?

7

我试图理解为什么需要使用像memcached这样的解决方案。这可能看起来是一个愚蠢的问题 - 但如果我只需要缓存对象,它会带来什么好处呢?简单的哈希映射不行吗?

5个回答

3
引用自 memcache 网站,memcache 是一种免费、开源、高性能、分布式内存对象缓存系统,具有通用性质,但旨在通过减轻数据库负载来加速动态 Web 应用程序。
Memcached 是一个针对小块任意数据(字符串、对象)的内存键值存储器,这些数据来自于数据库调用、API 调用或页面呈现的结果。Memcached 简单而强大,其简单的设计促进了快速部署、易于开发,并解决了许多大型数据缓存面临的问题。其 API 可用于大多数流行语言。
在本质上,它是一个简单的键/值存储器。这里的一个关键词是“分布式”。总的来说,引用 memcache 网站的话,“Memcached 服务器通常不知道彼此。没有交叉对话、同步、广播。缺乏互连意味着添加更多服务器通常会增加更多容量,就像您所期望的那样。可能有例外,但它们是例外并受到仔细考虑。”
我强烈建议阅读 memcache 的详细描述

3
我在解析“分布式内存对象缓存”方面遇到了麻烦……什么是分布式?如果我只有一个Web服务器,与使用哈希映射相比,Memcached提供了什么?看起来我需要详细说明它的作用。 - treefrog

2

你打算把这个哈希表放在哪里?它为你做了什么。在PHP上实现的任何结构都只存在于请求结束之前。如果你将东西放入持久缓存中,你可以在其他请求中获取它,而不是重新构建数据。


这不仅适用于PHP,还适用于其他提供基于会话存储的Web技术... - treefrog
@Dan Grossman如果我们手动创建一个“存储”目录,将每个对象存储在一个文件中(使用本地的PHP序列化/反序列化函数来设置/获取这些对象)。每个对象都可以通过开发人员选择的键(文件名)访问。对于大约200个对象,您知道这是否比memcached更快? - ling

2
我知道这个问题相当老了,但除了能够在多台服务器之间共享缓存之外,还有另一个方面没有在其他答案中提到,那就是值的过期。
如果将值存储在HashMap中,并将该HashMap绑定到应用程序上下文中,它将不断增大,除非以某种方式过期项目。为了实现最大的性能,Memcached会懒惰地过期对象。
当向memcache添加一个项目时,可以设置其过期时间,例如600秒。在对象过期后,它将仍然存在,但如果另一个对象请求它,则会清除它并返回null。
同样,当memcached内存已满时,它将查找第一个足够大小的过期项并将其过期,以为新项腾出空间。最后,可能会发生缓存已满且没有任何项目过期的情况,在这种情况下,它将替换最少使用的项目。

1

使用完整的缓存系统通常允许您在许多服务器上复制缓存,或者只是扩展到许多服务器以处理大量并行请求,在响应方面仍然保持足够快速。


0

这里有一篇(旧的)文章比较了 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 

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