城市站点
海外
登录 注册 购物车 方案咨询

缓存Ajax调用

发表于 2024-07-27 浏览量
使用正确的HTTP响应头,确保缓存Ajax调调用。除了绝对需要实时更新数据的Ajax调调用,其他都适用。应用方式:正确修改HTTP头Last-Modified、ache-contro1和Expires。

减少用户感知的响应时间,提高用户满意度,提高平台或解决方案的可扩展性。尽可能地利用Ajax和缓存Ajax调用,可以提高用户满意度,提高可扩展性。



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

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

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

但是有些操作会不利于对平台进行有效扩展。以用户在Web站点输搜察项搜索持定的产品为例。我们可能想在用人搜索项时,弹出一个下拉式菜单,列出一些建议的搜索项,这样我们需要查询产品目录来填充菜单。Ajax响应后继的击键把请求发送给服务器器,基于迄今为止输人的字符串返回一个结果填充下拉式菜单,而用户在输人时无需浏览器刷新页面。否则,可能会由于用户还没有输人完整的字符串,而返回不完整字符串的完整搜索结果。这两种实现在许多搜索引和电子商务站点都很常见。但是,让每个后继的击键都对服务器产生一个搜索查询,对后台系统来说,不仅成本高,而且是一种浪费。例如,用户输入" beanie baby"会引发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头的时间设置得足够长,才能使浏览器在本地缓存第一个查询的结果,以便之后的请求能够从缓存中读取它。对于静态对象和半静态对象,如用户头像或公司标志

可以把 Expires设置为几天或时间更长一些。有些对象肯定对时间敏感,如读取朋友博客上的状态更新。对于这种情况,可以把 Expires头设置为几秒或几分钟,这样既考虑到了实时性,又减少了全局负载。

使用Last- Modified头可以处理有条件的GE请求。在这种情况下,为了与HTTP1.1协议保持一致,如果缓存中的数据项是正确的或仍然有效,服务器应该用状态304响应。如Xmlhttpreuqest这个名字的Http部分所示,所有这些的关键在于,Ajax请求的表现与其他任何HTTP请求和响应的表现一样。知道了这些,有助于确保支持这些请求的系统的缓存能力、可用性和可扩展性。

当我们的内容在浏览器端可以更改时,前面的方法很有效,但对于逐渐扩展的搜索字符串,问题就变得有点困难了,在用户与搜索页面交互,并输入检索字符串时,就会出现这种情况。对于这种特殊情况,没有简单的解决方案。但在 cache- ontic1头中使用pub1iC参数可以确保把所有相近的搜索字符串都缓存到中间缓存和代理中。因此,被搜索字符串的常见开头和常见的中间部分很可能在读取它们之前就已经被缓存在某处了。这种特殊问题可以推广到利用Ajax的页面中的其他特定对象上。例如,请求拍卖中的物品的系统、请求社交网站站中的消息的系统或者邮件系统,在发出请求时,不应该使用相对位移量,而应该使用特定的消息ID。像"page=3&item=2"这样的相对名字,标识的是系统的第三页中的第二条消息,随着系统的改变,可能会造成缓存一致性问题。较好的方法是使用id=124556",这个ID表示一个原子项目,不会改变可以为这个用户进行缓存,如果它的属性是公共的,那么将来还可以被

较容易解决的情况是我们知道自己有哪些网站制作静态或半静态的项目集合,例如有限的或者上下文相关的产品目录。从客户端来看,我们可以异步获取这些结果,把它们缓存起来,可以供同一个客户将来使用,更重要的是确保CDN和中间缓存或代理程序缓存了它,以便其他用户执行相近的搜索时使用。