`
天梯梦
  • 浏览: 13763309 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

缓存为王

 
阅读更多

前面我写了一篇快速web app的关键是使用Ajax、优化Javascript和更好的缓存。

  • 使用Ajax可以减少网络流量到只有少量的JSON请求。
  • 优化Javascript(异步下载脚本、分组DOM修改、对UI进程作出让步等)允许请求可以并行然后快速渲染。
  • 更好的缓存意味着web app的大部分资源是存储在本地,然后并不会再有任何http请求了。

理解每种技术在哪里发挥作用很重要。使用Ajax,例如,不会让页面初始化加载更快(而且常常会不小心让它更慢),但是后面的“页面”(用户操作) 会更爽。另一方面,优化Javascript,会让初始页面和后面的页面都更快,更好的缓存则位于中间:第一次访问不快,但后面的访问会更快。同时,即便 在用户关掉浏览器之后再一次返回你的网站时初始化页面也会更快——这样性能优势要胜过浏览器会话(sessions)。

 

这些网站性能优化并不是互斥的——你应该都使用!但我(或者你也)想知道哪一个才有最大的效果呢?所以我进行了一次测试来测量这些不同的因素。我想要看看它们在实际网站中的效果,所以我使用了WebPagetest,这里我可以很方便的在Alexa排名前1000的网站中做一些测试。由于并没有办法让一个网站直接“Ajax化”,所以我决定专注与网络使用的时间。最后,我做了下面4项测试:

  • 基准——用IE9和一个模拟的DSL连接速度(1.5Mbps下载、384Kbps上传,50ms RTT)来运行Alexa排名前1000的网站。每个URL加载3次取中间值(基于页面加载时间)作为最终结果。只看“第一次”(无缓存)的页面加载。
  • 快速网络——除了使用一个模拟的FIOS网络(20Mbps下载,5Mbps上行,4ms RTT)以外和基准测试一致。
  • 无JavaScript——同基准测试一样,只是这次在RESTful API 上使用了“noscript”选项。效果和在浏览器中禁用JavaScript一致。这并不是一个对“优化JavaScript”的完美替代,因为所有的 JavaScript产生的HTTP请求都被跳过了,另一方面,所有在noscript标签里面的资源——如果有的话——又被加了进来。我们后面会对比 HTTP请求数。
  • 缓存模式——除了在“重复模式”下浏览以外其它和基准测试一致。这个测试用来看在今天给到缓存头(caching headers)的优势的最佳情况。然而并不是任何东西都可以缓存的,所以还是会有些网络请求发生。

哪个测试会产生最快的页面加载时间呢?思考一下然后写下你的猜测。我在开始测试前也猜测了一下,然后结果是我猜错了。。。

 

结果:

这个表显示了中间值和每个测试的window.onload时间的第95个百分位。基准测试的中间加载时间是7.65秒(95百分位是24.88)。每个优化都非常明显的让页面加载快了。下面是它们的对比:

  • 缓存模式是测试中最快的,3.46秒(95百分位是12.00).
  • 快速网络是第二快的,4.13秒 (95百分位是13.28).
  • 无JavaScript第三,4.74秒(95百分位是15.76).

我很惊讶无JavaScript竟然不是最快的。禁用JavaScript移除在下载资源时可能发生的阻塞行为。尽管IE9中脚本和其它大部分资源一起并行下载(请看Browserscope),它们也会引起阻塞字体文件或者其它边界情况。更重要地,禁用JavaScript减少了请求数量——从基准测试的90个降到59个,总请求大小也从927kb降到577kb。

快速网络的提升也超出了我的期待。请求的数量和带宽大小和基准测试一致,但是加载时间的中间值竟快了46%,从7.65秒降到4.13秒。这表明网络环境(连接速度和延迟)会有明显的影响。(难怪创建一个快速的移动网络体验很难。)


缓存赢得测试的关键是,请求数从90降到了32。有58个请求是从本地缓存读取的——而没有任何HTTP流量。HTTP Archive的关于Alexa 前1000名网站的 max-age表 显示,59%的请求被配置了缓存(max-age > 0)。它们中的大部分有比较短的不超过10分钟的缓存时间,但是由于“重复浏览”是立刻进行的,所以它们是从缓存中读取的——所以它确实是一个最佳案例 了。90的59%是53。另外的5个请求貌似由于启发式缓存(heuristic caching)而被从缓存中丢掉了。


尽管结果很意外,但我很高兴缓存被证明是如此有效的让网站更快的因素(或许也是最有效的因素)。我最近开始关注缓存。这是一个重要的开端——提高认识我们面前的谎言的机会。

 

仅仅使用今天的缓存头部,资源请求数量就减少了64%。但也只是“重复浏览”是立即进行的。如果我们等待了一天,19%的缓存就过期了,又会产生 17个新的If-Modified-Since请求。貌似那5个启发式缓存也会产生新的请求。所以我们需要换个方向让更多的资源缓存更长的时间。然后,要 得到快速加载资源的优势的话我们需要调查预读资源——甚至在浏览器请求它们之前——的方法。

PS:表示不太懂文中的“第95个百分点”(95th percentile),求高人解答~~

 

文章译自:Cache is King
中文原文:缓存为王
请尊重版权,转载请注明来源,多谢~~

分享到:
评论

相关推荐

    高级地图缓存技术_刘姗 王知方.pdf

    在《高级地图缓存技术》这篇文献中,作者刘姗与王知方详细介绍了地图缓存的基础概念及其重要性。缓存策略(Tiling Scheme)是确保不同缓存服务能够相互叠加的关键因素之一,主要包括以下几个方面: 1. **比例尺级别...

    面试中缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级怎么解答?.docx

    在面试中,对于缓存相关的知识点,面试官可能会考察你对缓存雪崩、缓存穿透、缓存预热、缓存更新以及缓存降级的理解和处理策略。以下是这些概念的详细解释: 1. **缓存雪崩** 缓存雪崩是指大量缓存在同一时刻过期...

    springboot笔记-集成Java本地缓存之王Caffeine Cache

    springboot笔记-集成Java本地缓存之王Caffeine Cache

    gcache国美高性能缓存_王復兴

    王復兴作为涉及该项目的关键人物,其名字出现在标题中,表明了他在相关开发或实施过程中的重要性。 描述中提到的“基于redis的大规模集群解决方案”指出,该缓存系统的核心技术基于Redis数据库,通过集群技术来解决...

    spring二级缓存

    `caching`和`Hibernate+ehcache二级缓存配置 - 王贵伟 - JavaEye技术网站.files`、`spring中配置二级缓存.files`这些目录可能包含了相关配置文件和资源。 总的来说,Spring二级缓存通过集成EhCache,实现了跨会话的...

    本地缓存之王Caffeine 保姆级教程(值得珍藏)

    在Java开发中,缓存是优化系统性能的关键技术之一,它可以极大地提高数据访问速度,减轻数据库的负担。Caffeine是Java 1.8引入的一个高效本地缓存库,它是Guava缓存的升级版,并在Spring 5之后成为默认的缓存实现。...

    技术架构设计原则

    缓存为王是架构设计中的另一个关键原则。通过合理地运用缓存技术,比如使用CDN、memcached或redis等,可以在不牺牲太多响应速度的情况下,极大地提升系统性能和可扩展性。在设计中合理地利用各级缓存,比如在浏览器...

    Spring集成的Hibernate配置二级缓存

    这里为User实体定义了一个独立的缓存,设置了最大本地堆大小和过期时间。 通过以上步骤,我们就成功地在Spring集成的Hibernate环境中配置了二级缓存。需要注意的是,二级缓存虽然可以提高效率,但也可能增加数据...

    ACOUG - Exadata V2 架构分析

    作者引用了Eygle的性能调优课程中提到的“缓存为王”的观点,强调了缓存的重要性。实验数据也表明,在引入FlashCache后,OLTP系统的响应速度和性能都有了明显提升。 作者还提及了Hybrid Columnar Compression(混合...

    电商类网站的高并发保障——03gcache国美高性能缓存_王復兴

    资源名称:电商类网站的高并发保障——03gcache国美高性能缓存_王復兴资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    HBase中Compaction及读缓存机制研究_王运萍

    将HBase作为研究对象,分析其存储架构,针对HBase存储机制进行深入研究

    mybatis+redis实现二级缓存

    还需要为每个需要缓存的Mapper配置对应的缓存实现。 4. **Shiro集成**:Shiro是一个强大的安全管理框架,它可以用于认证、授权、会话管理和安全控制。在项目中集成Shiro,可能是为了实现用户权限管理,并与缓存策略...

    重建图标缓存

    一键重建图标缓存!

    缓存系统整体架构设计思路

    缓存是CPU的一部分,它存在于CPU中 CPU存取数据的速度非常的快,一秒钟能够存取、处理十亿条指令和数据(术语:CPU主频1G),而内存就慢很多,快的内存能够达到几十兆就不错了,可见两者的速度差异是多么的大,缓存...

    MVC5.0 网站框架 加入缓存,速度快了10倍。

    总的来说,通过合理利用MVC5.0的缓存机制,我们可以显著提升网站的响应速度,为用户提供更快的服务。同时,结合基础的权限和用户管理,可以确保应用的安全性和可管理性。对于开发者来说,理解并掌握这些技术至关重要...

    Redis缓存管理工具:Redis-Desktop

    Redis是世界上最受欢迎的内存数据存储系统之一,常用于构建高性能、低延迟的应用程序,特别是作为数据库、缓存和消息中间件。Redis-Desktop 是一款专为方便开发者管理和操作Redis实例而设计的桌面客户端工具,提供了...

    java设计模式【之】享元模式【源码】【场景:多缓存可选模式】

    java设计模式【之】享元模式【源码】【场景:多缓存可选模式】 /** * 享元模式(预加载单例) * “元” 理解为 “同一地址对象” * 运用共享技术,减少对象的创建,降低对象的数量,降低内存消耗,提高性能 * ...

    [] - 2023-12-11 本地缓存之王,Caffeine 保姆级教程.pdf

    互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术...

    TWEB-企业级项目基于PWA缓存的最佳实践.pdf

    本文档“TWEB-企业级项目基于PWA缓存的最佳实践.pdf”通过王涵冰的介绍,深入探讨了企业级项目中应用PWA缓存技术的最佳实践。 首先,文档介绍了业务现状,提到了当前项目中存在的性能瓶颈,例如,在不同的客户端...

Global site tag (gtag.js) - Google Analytics