【问题标题】:Session VS File VS Memcache for a Cache in PHP?会话 VS 文件 VS Memcache 用于 PHP 中的缓存?
【发布时间】:2010-11-14 22:24:49
【问题描述】:

我有一个社交网络

  • users 表大约有 60,000 行

  • friends 表在 100 万左右 行(用于确定谁是您的
    朋友)

我想做一个朋友提要,墙,无论你喜欢怎么称呼它,它都会显示用户状态帖子(twitter 类型的帖子)之类的东西,它会显示一些不同的项目,但一开始它只是朋友状态,也许还有博客文章。

基本上,您只会看到使用您朋友列表中的用户 ID 发布的内容。

我一直在努力想出最好的方法,但还没有走多远,但这是我的最新想法。

目前要构建这个提要,我必须

  1. 获取好友ID列表 大朋友桌

  2. 从好友那里获取流数据 以上结果中的ids

  3. 加入用户表以获取 发布者图片 URL 和用户名

  4. 然后加入 cmets 表得到 cmets 发布在 Feed 项上

构建该提要是一项艰巨的任务

到目前为止,我有 3 个想法,这就是您可以提供帮助的地方。

内存缓存选项:

  1. 使用 memcache 缓存用户 当用户的朋友列表作为一个数组 登录网站,当用户 批准一个新的好友请求 要添加到那里的朋友,它 将在那里重建缓存。
  2. 除了获取朋友之外,我还可以在那里保存朋友的图片 URL 和用户名,这将通过在构建朋友提要时消除此查询来再次加快速度。

文件缓存选项:

  1. 执行与 memcache 选项相同的操作 只是将此数据保存为数组 到缓存文件而不是内存, 然后将此缓存文件包含到 页面。

  2. 我不确定哪个是最好的 我理解的表现方法 memcache 将所有内容存储在内存中 所以拥有20,000的朋友 可以使用很多的朋友 内存和文件缓存只会 当用户将其放入内存中 如果我是正确的,需要它。另外如果我 做了文件方法,当用户 退出网站,我会删除 有缓存文件所以缓存文件夹 文件永远不会太大

会话缓存选项:

  1. 和上面的文件缓存一样,我刚刚意识到会话数据被保存到一个文件中,那不就让它成为一个缓存吗?

请给我您对此的意见或任何建议或信息,因为我对缓存知之甚少,我读过很多书,但有时其他人的想法很有帮助

【问题讨论】:

  • “会话数据保存到文件中”。你上面的说法是错误的。会话可以配置为存储在数据库中。默认会话处理程序是文件。

标签: php session caching memcached


【解决方案1】:

Memcache 是您最好的选择,原因有很多:

  1. 速度非常快 - 一切都在内存中,并且针对像您这样的情况进行了高度优化(以及一般的缓存:)
  2. 它是分布式的 - 这意味着如果您有多个 Web / 应用服务器在运行,它们都可以访问同一个缓存
  3. 您可以为 memcache 汇集多个服务器 - 如果您有一些相对未充分利用的服务器(或多个专用缓存服务器),您可以将它们全部汇集到一个大缓存中
  4. 它具有超强的可扩展性(出于前面提到的原因)
  5. 它有很好的 PHP 支持 - 用于 memcache 的 PECL 包最近更新了很多新的优点
  6. 您甚至可以将您的用户会话存储在内存缓存中 - 只需在您的 php.ini 文件中进行设置。这比将会话存储在数据库中要快得多,并且允许您的会话在多个 Web 主机上持续存在(如果您处于负载平衡的情况下)......这也将使您的网站性能有所提升,因为不需要访问文件系统/数据库以获取每个请求的会话信息。

...还有更多;)

关于您对单个缓存项目的内存占用的一些担忧,您有几个选择。我最初的想法是试一试,看看这些缓存项到底有多大(你可以找到几个开源的东西来监控实际的缓存使用情况,比如 cacti)。我认为它们会比您想象的要小。

如果不是,我建议您根据实际缓存的内容、多长时间等重新考虑您的缓存策略。也许您可以从缓存中已经存在的几个内容构建提要(即缓存个人用户数据,然后从缓存中的所有这些单个项目为一个人构建提要)。在这方面有很多好文章,只需搜索它们即可:)

【讨论】:

  • 感谢您的帖子提供了非常丰富的信息,当您提到 cacti 用于测量 ram 使用时,您是指一般测量它还是在使用 memcache 时测量它?谢谢
  • 实际上有一个 cacti 插件用于监控 memcache 本身...会给你命中/未命中、num 项目等。
  • 感谢我迫不及待地想尝试 memcache,而且我刚刚发现 facebook 将人们限制为 5,000 个朋友,所以我想我也会这样做,这将比任何事情都更有帮助!
【解决方案2】:

Memcache 中允许的默认最大对象大小为 1MB。

@jsaondavis: “会话数据保存到文件中”。

你上面的说法是错误的。会话可以配置为存储在数据库中。默认会话处理程序是文件。

【讨论】:

    【解决方案3】:

    Redis 将是一个很好的解决方案:

    这是关于 Redis Vs 的一个帖子。内存缓存。 听起来 Redis 有 512mb 的存储空间,而不是 1mb 的限制......有点不同:)

    Memcached vs. Redis?

    【讨论】:

      【解决方案4】:

      错了! Memcached 的大小不固定!这取决于您设置的计算机内存和配置。

      【讨论】:

        猜你喜欢
        • 2010-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-18
        • 1970-01-01
        • 2011-04-24
        • 1970-01-01
        相关资源
        最近更新 更多