问题 Ajax请求/响应:如何使它们快速闪电?


我遇到了一个与Google Suggest非常相似的网站。当您在搜索框中键入2个字符时(例如,如果您正在搜索“canon”产品,则为“ca”),它会产生4个Ajax请求。每个请求似乎都在不到125毫秒内完成。我随便观察到Google Suggest需要500毫秒或更长时间。

在任何一种情况下,两个站点都很快。 为了获得超快的请求/响应,应遵循哪些一般概念/策略? 谢谢。

编辑1:顺便说一下,我计划为电子商务网站搜索实现自动完成功能,其中1.)根据输入的内容提供搜索建议,以及2.)根据已经存在的内容匹配潜在产品的列表打字到目前为止。我正在尝试类似于SLI Systems搜索的东西(参见 http://www.bedbathstore.com/ 例如)。


5832
2017-12-09 22:15


起源



答案:


这是一个“多长时间是一个字符串”的问题,因此我将其作为社区维基的答案 - 每个人都可以自由地加入它。

我要说的是确保:

  1. 您正在查询的服务器/服务器场/云的大小根据您投入的负载正确调整和/或可以根据该负载调整自身大小
  2. 服务器/服务器场/云连接到良好的快速网络主干
  3. 您正在查询服务器端(数据库表或您有什么)的数据结构被调整为尽快响应这些精确请求
  4. 你没有做出不必要的请求(HTTP请求的设置成本很高;你想避免在一个人做的时候解雇其中的四个);您可能还想进行一些滞后管理(在人们输入时延迟请求,仅在停止后发送几秒钟,如果再次启动则重置超时)
  5. 您可以通过线路发送尽可能少的信息,因为可以合理地用于完成工作
  6. 您的服务器配置为重用连接(HTTP 1.1)而不是重新建立它们(在大多数情况下这将是默认设置)
  7. 你正在使用正确的服务器;如果一个服务器有大量的保持活动请求,它需要被设计为优雅地处理它(NodeJS是为此而设计的;作为一个例子; Apache不是,特别是,虽然它当然是 非常 服务器)
  8. 您可以缓存常见查询的结果,以避免不必要地转到底层数据存储

9
2017-12-09 22:27



@TJ:你能详细说明第6点和第8点。我正在构建一个简单的LAMP设置和基本托管。因此,我需要关注我可以作为“小家伙”实施的建议。 - StackOverflowNewbie
我会说,首先,问问自己“这必须是一个AJAX请求,还是我可以从一开始就将数据加载到客户端并在客户端工作?” - Matt
@StackOverflowNewbie:Re 6,如果你使用的是现代网络服务器,你不应该做任何事情,它应该已经配置为允许保持活动。 Re 8,这是在你的“真实”之前使用代理Web服务器来缓存查询结果以便它可以重用它们(例如nginx可以配置为执行此操作),或使用服务器 - 在短暂的持续时间内将结果保留在内存中的辅助技术(假设您的服务器当然没有内存限制)。 - T.J. Crowder
你的答案似乎是一般指导方针,对于初学者来说已经足够了...... - Shrinath


答案:


这是一个“多长时间是一个字符串”的问题,因此我将其作为社区维基的答案 - 每个人都可以自由地加入它。

我要说的是确保:

  1. 您正在查询的服务器/服务器场/云的大小根据您投入的负载正确调整和/或可以根据该负载调整自身大小
  2. 服务器/服务器场/云连接到良好的快速网络主干
  3. 您正在查询服务器端(数据库表或您有什么)的数据结构被调整为尽快响应这些精确请求
  4. 你没有做出不必要的请求(HTTP请求的设置成本很高;你想避免在一个人做的时候解雇其中的四个);您可能还想进行一些滞后管理(在人们输入时延迟请求,仅在停止后发送几秒钟,如果再次启动则重置超时)
  5. 您可以通过线路发送尽可能少的信息,因为可以合理地用于完成工作
  6. 您的服务器配置为重用连接(HTTP 1.1)而不是重新建立它们(在大多数情况下这将是默认设置)
  7. 你正在使用正确的服务器;如果一个服务器有大量的保持活动请求,它需要被设计为优雅地处理它(NodeJS是为此而设计的;作为一个例子; Apache不是,特别是,虽然它当然是 非常 服务器)
  8. 您可以缓存常见查询的结果,以避免不必要地转到底层数据存储

9
2017-12-09 22:27



@TJ:你能详细说明第6点和第8点。我正在构建一个简单的LAMP设置和基本托管。因此,我需要关注我可以作为“小家伙”实施的建议。 - StackOverflowNewbie
我会说,首先,问问自己“这必须是一个AJAX请求,还是我可以从一开始就将数据加载到客户端并在客户端工作?” - Matt
@StackOverflowNewbie:Re 6,如果你使用的是现代网络服务器,你不应该做任何事情,它应该已经配置为允许保持活动。 Re 8,这是在你的“真实”之前使用代理Web服务器来缓存查询结果以便它可以重用它们(例如nginx可以配置为执行此操作),或使用服务器 - 在短暂的持续时间内将结果保留在内存中的辅助技术(假设您的服务器当然没有内存限制)。 - T.J. Crowder
你的答案似乎是一般指导方针,对于初学者来说已经足够了...... - Shrinath


您将需要一个能够快速响应的Web服务器,但这通常不是问题。您还需要一个快速的数据库服务器,并且可以非常快速地查询哪些热门搜索结果以“ca”开头。 Google根本没有使用传统数据库,而是使用大型服务器集群,a 卡桑德拉类似数据库,大部分数据都保存在内存中,以便更快地访问。

我不确定你是否需要这个,因为只使用运行PHP和MySQL的单个服务器就可以获得相当不错的结果,但你必须对存储和检索信息的方式做出一些很好的选择。如果您运行这样的查询,您将无法获得这些快速结果:

select
  q.search
from
  previousqueries q
where
  q.search LIKE 'ca%'
group by
  q.search
order by
  count(*) DESC
limit 1

只要少于20人使用您的搜索,这可能会有效,但在您达到100.000之前可能会失败。


2
2017-12-09 22:27



我正在使用java n mysql..how我的查询应该是..对于快速响应...查询右边就像这样选择q.search从previousqueries q其中q.search LIKE'ca%' - Lucky
你最好在一个新问题中提出这个问题。你现在正在评论一个2岁的问题。 - GolezTrol


您可以从为您的产品做快速搜索引擎开始。查看Lucene的全文搜索。它可用于PHP,Java和.NET等。


1
2017-12-09 22:32



将使用Solr。 - StackOverflowNewbie


这个链接解释了他们是如何做的 即时预览快速。整个网站highscalability.com是一个信息丰富的网站。

此外,您应该将所有内容存储在内存中,并且应该避免从光盘中检索数据(慢!)。例如Redis闪电般快!


1