【问题标题】:What are some of the best tools/strategies to cache medium/large data sets in PHP?在 PHP 中缓存中/大型数据集的最佳工具/策略是什么?
【发布时间】:2014-02-18 22:53:38
【问题描述】:

我有你的普通 PHP 应用程序(在 Windows 服务器上运行),其中包含表单和数据网格/列表,其中一些需要运行相当复杂的查询,我已经优化到了最大值,我怀疑有很多事情可以完成让他们跑得更快。鉴于依赖于结构的其他进程,我也没有更改数据库结构的选项。因此,由于缓存并没有真正在应用程序中被大量使用,这似乎是下一个合乎逻辑的步骤。

我最近阅读了有关分代缓存的文章,并提出了一个不错的机制来自动缓存我的应用程序中的查询。我现在的问题是我遇到了两个选项的大小限制,这两个选项似乎是合乎逻辑的选择。 WinCache 将您的总大小限制为 85MB,这不会削减它,而 memcached 将一个项目限制为 1MB,如果您有一个返回相当多的记录并且有很多记录的查询,这似乎并不多的领域。好的,确切地说,现在似乎 memcached 允许您设置更大的大小,但仅仅因为默认情况下它是 1MB 并且过去只允许这样做,这让我质疑我正在尝试做什么。

我的网格允许一次返回的最大记录数是 1000 条记录,因此这是可以存储在缓存中的最大记录数(当然,每条记录的字段会有所不同)。我知道大量用户可能意味着缓存会很快填满,但是并发用户的数量通常并不多,根据我的阅读,如果 memcached 内存不足,它只会删除最旧的缓存的项目,所以我认为存储更大的数据集没有很大的缺点,除非操作非常昂贵,但从我读过的内容来看,情况似乎并非如此。

总而言之,我想知道在 memcached 中存储更大的数据集是否是个坏主意(当然,我知道我不想在其中存储包含一百万条记录的查询)。如果这是一个坏主意,那么在检索这些数据集时,什么是缓存/提高性能的好选择?

【问题讨论】:

  • 请问是什么问题?系统执行查询需要很长时间吗?您尝试从数据库中获取的数据有多大?
  • 请问,为什么需要在一个网格上为一个用户返回 1000 条记录?
  • @Wesley 一些查询可能需要更长的时间,当负载增加时问题会更加复杂。数据本身并不总是那么大,有时只是检索数据的查询的复杂性会减慢速度。
  • @Gustavo 我个人认为没有必要,但管理层的一些人相信有些客户不想分页。我猜,所以称其为业务需求。我可以改用缓冲网格,但这种方法也有其自身的不便。
  • @Rocket04 当用户向下滚动时从 ajax 动态加载怎么样?事实是他们无法一次查看一千条记录,见鬼,甚至一百条。你可以实现一些东西来检索有限的记录,比如 100 条,然后随着用户滚动加载更多。

标签: php caching memcached


【解决方案1】:

除非您有充分的理由通过网络将该数据发送到缓存,否则不要

如果可能,请使用本地进程中缓存解决方案,例如 APC(u) 或 YAC(YAC 是非常聪明的软件,可能不稳定)。

当 APC(u) 或实际上是 wincache 将数组和标量复制进出共享内存时,它们会按位逐字节进行,它们不会序列化或以其他方式更改数据的格式,这个,再加上网络开销为 0 的事实,使得像 APC(u) 这样的本地缓存解决方案比 memcached 或 redis 这样的解决方案快得多。

APC(u) 对段或条目的大小没有任何限制,您应该能够将其配置为使用操作系统允许映射的所有内存。

当然,如果您有充分的理由想要通过网络发送,那么这是非常无用的信息;)

【讨论】:

  • 我确实使用了本地缓存 (WinCache) 并且对它感到满意,直到我看到它最多只能容纳 85mb 的数据。我最初尝试使用 APC,但它似乎不能很好地与 Windows 配合使用,或者至少我无法使其正常工作,经常出现随机错误。有人建议使用 WinCache,效果很好,但现在我已经达到了这个限制。
  • APC 几乎被抛弃是事实,唯一可取和支持的设置是 opcache+apcu ...如果您尝试 APCu 并发现错误,请报告它们,您会得到我的只要我有时间看窗户就注意...希望你能到达某个地方;)
  • 谢谢,我没有注意到 APC 和 APCu 之间的区别!我去看看。
【解决方案2】:

您可以使用很多选项:

1) 如果您要处理大量查询,那么使用 MASTER/SLAVE DB ARCHITECTURE 会有很大帮助。选择查询可以在 SLAVE DB,这将减少 MASTER DB 上的巨大过载。

2) SPHINX 的使用肯定会帮助您提高数据检索的速度。你可以在维基百科文章WIKI-Sphinx阅读。

3) 您也可以使用REDIS 服务器,它也支持主/从复制。 REDIS ARTICLE

它还取决于其他因素,您规范化表结构、索引、执行连接的方式。

注意::通常会避免不必要地使用 JOINS。你可以在这里阅读它IBM-Avoiding unnecessary outer joins

希望对你有帮助

【讨论】:

    【解决方案3】:

    由于您的 Web 应用程序运行大量返回大数据集的复杂查询,因此您绝对应该考虑缓存数据。

    如果您可以通过 shell 访问系统,我建议您使用一个非常受欢迎且非常受欢迎的 Web 应用程序加速器 Varnish,它可以大大加快您的页面速度。

    【讨论】:

      【解决方案4】:

      如果 memcached 位于与数据库不同的服务器上会更好。因此,您将平衡来自 2 个不同位置的负载。因此,非缓存的结果将直接来自数据库服务器,而缓存的结果将来自另一个。

      我在这里能给出的唯一建议就是不要沉迷于缓存。因为你达到了一个点,如果你的 memcached 服务器崩溃了一段时间,所有的负载都会落在数据库服务器上,它也会崩溃。

      【讨论】:

      • 我不打算在数据库服务器上运行它。我也不认为如果 memcached 崩溃了,该应用程序不会崩溃,该应用程序可以像现在一样运行良好并且不会崩溃,它只需要提高速度。
      【解决方案5】:

      无需对您的应用程序进行大的更改,您就可以做出更多选择:

      • 您可以缓存整个前端。只需创建一个每 5 分钟运行一次的作业(取决于您的应用程序的数据更改)并在 html 目录中创建 html 文件。当客户端从您的服务器请求 url 时,会提供 html 文件。这可能非常方便。

      • 使用nginx 缓存也是一个不错的选择。

      • 您可以将一些硬件添加到您的网络中,这些硬件可以毫无问题地缓存大量数据。 Nginx 是软件解决方案,netscaler 是硬件解决方案。看起来citrix 对此有很好的解决方案。

      【讨论】:

        猜你喜欢
        • 2010-09-06
        • 2017-02-09
        • 2015-12-13
        • 1970-01-01
        • 2012-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多