Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中缓存中/大型数据集的最佳工具/策略有哪些?_Php_Caching_Memcached - Fatal编程技术网

在PHP中缓存中/大型数据集的最佳工具/策略有哪些?

在PHP中缓存中/大型数据集的最佳工具/策略有哪些?,php,caching,memcached,Php,Caching,Memcached,我有一个普通的PHP应用程序(在Windows server上运行),它包含表单和数据网格/列表,其中一些需要运行非常复杂的查询,我已经将其优化到最大,我怀疑有多少方法可以让它们运行得更快。考虑到依赖于数据库结构的其他进程,我也没有改变数据库结构的选项。因此,由于缓存在应用程序中并没有被广泛使用,这似乎是下一个合乎逻辑的步骤 我最近阅读了关于分代缓存的文章,并提出了一种体面的机制,可以在我的应用程序中自动缓存查询。我现在的问题是,这两个选项似乎都是合乎逻辑的选择,我都遇到了大小限制。WinCac

我有一个普通的PHP应用程序(在Windows server上运行),它包含表单和数据网格/列表,其中一些需要运行非常复杂的查询,我已经将其优化到最大,我怀疑有多少方法可以让它们运行得更快。考虑到依赖于数据库结构的其他进程,我也没有改变数据库结构的选项。因此,由于缓存在应用程序中并没有被广泛使用,这似乎是下一个合乎逻辑的步骤

我最近阅读了关于分代缓存的文章,并提出了一种体面的机制,可以在我的应用程序中自动缓存查询。我现在的问题是,这两个选项似乎都是合乎逻辑的选择,我都遇到了大小限制。WinCache将您的总容量限制为85MB,而memcached将一个项的容量限制为1MB,如果您有一个返回相当多的记录和很多字段的查询,那么这个容量似乎不多。好的,确切地说,memcached现在似乎允许您设置更大的大小,但仅仅是它默认为1MB,并且过去只允许这样一个事实就让我怀疑我正在尝试做什么

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


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

由于您的web应用程序运行大量复杂的查询,返回一个大数据集,您肯定应该研究缓存数据


如果您有shell访问系统的权限,我建议您使用一种备受赞誉且流行的web应用程序加速器,它可以大大加快页面的速度。

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


我唯一能给你的建议就是不要沉迷于缓存。因为您可能会遇到这样的情况:如果您的memcached服务器崩溃一段时间,所有负载都会转移到数据库服务器上,数据库服务器也会崩溃。

您可以选择很多选项:

1) 如果您要处理大量查询,那么使用主/从数据库体系结构将非常有帮助。可以在从数据库上执行选择查询,这将减少主数据库上的巨大过载

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

3) 您还可以使用同样支持主/从复制的REDIS
服务器

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

注意::通常避免不必要地使用联接。你可以在这里读到


希望这有助于

在不对应用程序进行重大更改的情况下,您还有更多选择要做:

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

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

  • 有一些硬件,你可以添加到你的网络,可以缓存真正的大量数据没有任何麻烦。Nginx是软件解决方案,netscaler是硬件解决方案。看起来有很好的解决方案


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

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

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

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


      当然,如果你有很好的理由想通过电话发送,那么这是非常无用的信息;)

      我不打算在数据库服务器上运行它。如果memcached崩溃,我也不认为应用程序会崩溃,应用程序现在运行良好,没有崩溃,只是需要提速。我能问一下,问题是什么?系统执行查询是否需要很长时间?还有,您试图从数据库中获取的数据有多大?我可以问一下,为什么您需要为一个用户在网格上返回1000条记录?@Wesley有些查询可能需要更长的时间,而当负载更大时,问题就更复杂了。数据本身并不总是那么大,有时只是检索数据的查询的复杂性减慢了速度。@Gustavo I p