什么是在PHP中缓存中/大数据集的最佳工具/策略?

时间:2014-02-18 22:53:39

标签: php caching memcached

我有你的平均PHP应用程序(在Windows服务器上运行),包含表单和数据网格/列表,其中一些需要运行我已经优化到最大的非常复杂的查询,我怀疑可以做的很多使它们运行得更快。在给定依赖于结构的其他进程的情况下,我也没有更改数据库结构的选项。因此,由于缓存在应用程序中并未真正使用过多,这似乎是下一个合乎逻辑的步骤。

我最近阅读了代际缓存,并提出了一种可靠的机制,可以在我的应用程序中自动缓存查询。我现在的问题是,我遇到了两个似乎都是逻辑选择的选项的大小限制。 WinCache限制你总共85MB,这不会削减它,memcached限制一个项目为1MB,如果你有一个返回相当多的记录并且有很多的查询,这似乎不是很多的领域。好吧,确切地说,似乎memcached现在允许你设置一个更大的尺寸,但事实上它默认为1MB并且过去只允许这让我怀疑我正在尝试做什么。

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

总而言之,我想知道的是,如果在memcached中存储更大的数据集是一个坏主意(并且被授予,我知道我不想在其中存储具有一百万条记录的查询)。如果这是一个坏主意,在检索这些数据集时,什么是缓存/提高性能的好方法?

5 个答案:

答案 0 :(得分:2)

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

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

当APC(u)或wincache实际上,将数组和标量复制到共享内存中时,它们逐位地逐字节地执行,它们不会序列化或者必须更改数据格式,这样,再加上网络开销为0,使APC(u)等本地缓存解决方案比memcached或redis更快。

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

当然,如果你有充分的理由希望通过电汇发送,那么这是非常无用的信息;)

答案 1 :(得分:1)

由于您的Web应用程序运行了很多返回大数据集的复杂查询,因此您一定要考虑缓存数据。

如果你有对系统的shell访问权限,我建议使用一个非常受欢迎的流行的Web应用程序加速器Varnish来加速你的页面。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

您可以使用很多选项:

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

2)使用 SPHINX 肯定会帮助您提高数据撤销的速度。您可以在维基百科文章WIKI-Sphinx中阅读相关内容。

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

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

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

希望这有帮助

答案 4 :(得分:1)

如果不对您的应用程序进行重大更改,您还可以做出更多选择:

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

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

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