RELATEED CONSULTING
相关咨询
选择下列产品马上在线沟通
服务时间:9:30-18:00
你可能遇到了下面的问题
关闭右侧工具栏

技术支持

缓存Ajax调用
  • 作者:技术小林
  • 发表时间:2018-07-18 14:44
  • 来源:未知

  对于新人或者不熟悉常见的网络术语的人来说,可以把Ajax看作隐藏在下拉式菜单后的“方法”,当你输入字符串时,可以以给你提示,或者把它看作隐藏在地图服务中的“方法”,让你能够无需再次调用远程服务器,就能够放大或缩小地图。如果使用得当,利用Ajax不仅可以得到极好的与用户互动的界面,而且由于无需额外的服务器端工作就能让用户处理数据和对象并与之交互,还能提高可扩展性。但是,如果使用不当,那么Ajax会极大地增加服务器需处理的请求数,从而制造出一些特有的扩展性约束。但要注意,虽然这些请求从浏览器端来看是异步的,却可能在短时间内造成服务器群内的请求泛滥并造成服务器瘫痪。虽然常常被称为一种技术,但最好的描述还是浏览器用于创建更丰富的更具有交互性的Web应用的一组技巧、语言、方法和技术的集合。虽然这个缩写中的词语描述了Ajax的实现方式,但真正的用户交互可能不是异步的,不必只用XML作为数据交换的格式。例如,可以用JSON代替XML。但Javascript是无可替代的。

  JesseJamesGarrett因在2005年发表的文章“Ajax:创建Web应用的新方法”이中创造了术语Ajax而广泛被人提及。宽泛地说,Ajax具有用CSS和DHTML实现的标准表达方式、用文档对象模型(DOM)实现的交互和动态显示能力、用XSLT或JSON实现的XML这样的数据交换和操作机制,以及数据检索机制。从终端用户的角度看,数据检索通常是异步的(但并不绝对必须是异步的)。Javascript是用于实现客户端浏览器内交互的语言。当使用异步数据传输时,要采用Xmlhttprequest对象。我们最初的因特网经验是所有东西都是请求和应答这样的交互,Ajax的目的就是终止这些复杂的交互。有了这些背景知识,让我们看看与Ajax相关的扩展性方面需要注意的问题,最后看看缓存如何帮助我们解决这些问题。

  显然,我们一直想创建能够提高用户交互和满意度的界面,这样就能够增加收益、利润和股东的财富。Ajax就是这样一种方法,利用它可以给最终用户提供更丰富更实时的体验。由于它能减少浏览器内不必要的交互,所以用户交互可以发生得更快。用户可以进行放大或缩小操作,而无需等待服务器的响应,可以用以前的条目预填充下拉式菜单,当用户在搜索栏中输人查询字符串时,他们可以看得一些潜在搜索字符串,从中他们也许会找到更具有指导性的搜索条件。利用Ajax的异步性,无需让用户点击“下一页”,就可以根据某些用户操作反复接收邮件,帮助我们把邮件结果载入客户浏览器。

  但是有些操作会不利于对平台进行有效扩展。以用户在Web站点输搜察项搜索持定的产品为例。我们可能想在用人搜索项时,弹出一个下拉式菜单,列出一些建议的搜索项,这样我们需要查询产品目录来填充菜单。Ajax响应后继的击键把请求发送给服务器器,基于迄今为止输人的字符串返回一个结果填充下拉式菜单,而用户在输人时无需浏览器刷新页面。否则,可能会由于用户还没有输人完整的字符串,而返回不完整字符串的完整搜索结果。这两种实现在许多搜索引和电子商务站点都很常见。但是,让每个后继的击键都对服务器产生一个搜索查询,对后台系统来说,不仅成本高,而且是一种浪费。例如,用户输入“beaniebaby”会引发111次连续的搜索,而真正需要的只有一次。这样的用户体验可能令人印象深刻,但是如果用户输人足够快,那么在结束输人前可能有8到10个搜索都不会真正返回结果。

  还有一种方法,能够在不增加10倍流量的情况下达到相同的目标,你也许能根据本章的主题猜到这种方法,那就是利用缓存。只需要很少的工作,就可以把上一次Ajax交互的结果缓存在客户浏览器中、也可能是缓存在CDN(请参阅原则20)、页面缓存(请参阅原则23)、应用缓存(请参阅原则24)中。首先,让我们看看如何利用浏览器的缓存。三个能确保我们在浏览器中缓存内容的关键元素是HTTP响应中的cache-contro1头、Expires头和Last-Modified头。我们在原则21中详细讨论过其中的两个。对于Cache-Contro1,要避免使用no-store,在可能的地方把它设置为public,这样我们的终端(客户)和服务器之间的任何代理和缓存(如CDN)都可以保存结果集,向其他请求提供数据。当然,我们不想把私有数据设置为public,但在可能的情况下,我们当然想利用pub1ic提供的高度缓存。

  记住,我们的目标是减往而少服务器的负载。因此,应该把响应的Expires头的时间设置得足够长,才能使浏览器在本地缓存第一个查询的结果,以便之后的请求能够从缓存中读取它。对于静态对象和半静态对象,如用户头像或公司标志