【问题标题】:why memcached instead of hashmap为什么 memcached 而不是 hashmap
【发布时间】:2011-02-05 19:30:02
【问题描述】:

我试图了解使用 memcached 之类的解决方案需要什么。这似乎是一个愚蠢的问题 - 但如果我只需要缓存对象,它会带来什么?不是一个简单的哈希图吗?

【问题讨论】:

    标签: memcached hashmap


    【解决方案1】:

    引用memcache web site,memcache 是……

    免费和开源,高性能, 分布式内存对象缓存 系统,本质上是通用的,但是 用于加速 动态网络应用程序 减轻数据库负载。

    Memcached 是内存中的键值对 存储小块任意 结果中的数据(字符串、对象) 数据库调用、API 调用或页面 渲染。 Memcached 很简单 强大的。其简单的设计促进 快速部署,易于开发, 解决了很多大问题 数据缓存。它的 API 可用于 最流行的语言。

    本质上它是一个简单的键/值 商店

    这里的一个关键词是分布式。一般来说,再次引用 memcache 站点,

    Memcached 服务器通常是 彼此不知情。没有 串扰,无同步,无 广播。缺乏 互连意味着增加更多 服务器通常会增加更多容量 如您所料。可能有 这条规则的例外,但它们是 例外并仔细考虑。

    我强烈推荐阅读detailed description of memcache

    【讨论】:

    • 我在解析“分布式内存对象缓存”时遇到问题……什么是分布式的?如果我只有一个网络服务器,memcached 提供什么而不仅仅是一个哈希图......似乎我需要把它拼出来:(
    【解决方案2】:

    你打算把这个哈希图放在哪里?这就是它为你做的事情。您在 PHP 上实现的任何结构都只存在于请求结束之前。如果您将内容放入持久缓存中,则可以将其取回以供其他请求使用,而不是重建数据。

    【讨论】:

    • 这不仅适用于 php,也适用于其他提供基于会话的存储的 Web 技术...
    • @Dan Grossman 如果我们手动创建一个“存储”目录,它存储每个对象,每个文件一个对象(并且我们使用原生 php 序列化/反序列化函数来设置/获取这些对象)。每个对象都可以通过开发人员选择的密钥(文件名)进行访问。对于大约 200 个对象,你知道这是否会比 memcached 更快吗?
    【解决方案3】:

    我知道这个问题比较老了,但是除了能够跨多个服务器共享缓存之外,还有另一个方面在其他答案中没有提到,那就是值过期。

    如果您将值存储在 HashMap 中,并且该 HashMap 绑定到应用程序上下文,它将不断增长,除非您以某种方式使项目过期。 Memcached 延迟对象过期以获得最佳性能。

    当一个项目被添加到内存缓存时,它可以有一个过期时间,例如 600 秒。对象过期后它会一直保留在那里,但如果另一个对象请求它,它将清除它并返回 null。

    类似地,当 memcached 内存已满时,它会寻找第一个足够大小的过期项并将其过期以为新项腾出空间。最后,也可能发生缓存已满且没有任何项目过期的情况,在这种情况下,它将替换最少使用的项目。

    【讨论】:

      【解决方案4】:

      使用完全标记的缓存系统通常允许您在多台服务器上复制缓存,或者只是扩展到多台服务器以扩展大量并行请求,所有这些在回复方面仍然可以接受。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-08-07
          • 2023-01-14
          • 1970-01-01
          • 2015-09-06
          • 2010-11-29
          • 1970-01-01
          • 2021-12-07
          • 1970-01-01
          相关资源
          最近更新 更多