浏览器缓存机制的研究分享

源宝导读:互联网Web应用大行其道的今天,浏览器已经成为Web应用运行的重要平台。而Web应用对浏览器缓存机制的高效利用,可以大幅提升应用性能和用户体验。本文将对浏览器缓存机制进行系统化的梳理,分享我们的经验。

一、背景

    计算机读取数据的速度逐步递减:缓存>内存>硬盘, 为了提高数据处理性能,其中一个策略就是对缓存的高效利用。类似的,利用浏览器缓存是Web应用性能优化的重要手段之一。优先的缓存策略可以缩短网页请求资源的距离,减少延迟,并且可以缓存文件进行复用,还可以减少带宽,降低网络负荷。

    对于一个数据请求来说,可以分为“发起请求”、“后端处理”、“浏览器响应”3个阶段,对缓存的高效利用,可以大幅提升前2步的性能。

二、对浏览器缓存机制的研究

2.1、缓存类型

  • Memory Cache
    memory cache 是内存中的缓存,主要包含当前页面中已经抓取到的资源。

  • Disk Cache
    disk cache 是硬盘中的缓存。

    通常浏览器缓存分为2种:强缓存和协商缓存,并且都是通过设置HTTP Header实现的。

2.2、缓存过程

    浏览器每次发起请求,都会先在浏览器缓存中查找请求的结果和标识。浏览器每次拿到返回的请求都会将该结果和缓存标识存入缓存中。

  • 先检查内存,如果有,直接返回。

  • 如果内存没有,则去硬盘获取,如果有直接返回。

  • 如果硬盘也没有,那么就进行网络请求。

  • 加载到的资源缓存到硬盘和内存。

2.3、强缓存

    强缓存:不会向服务器发生请求,直接从缓存中读取资源。在 chrome 控制台可以看到该请求返回 200 的状态码,并且 size 显示 from disk cache 或 from memory cache。
    强缓存可以通过设置HTTP Header 实现:expires 和 Cache-Control。

  • expires
    缓存过期时间,用来指定资源到期时间,是服务器的具体的时间点。expires=max-age + 请求时间,需要和 last-modified 结合使用。expires 是 HTTP/1 的产物,受限于本地时间,修改本地时间,可能会导致缓存失效。

  • cache-control
    cache-control 可以在请求头或响应头中设置,可以组合使用多种指令。

    • public:所有内容都会被缓存。

    • private: 所有内容只有客户端可以缓存。

    • no-cache: 不是说浏览器不使用缓存,而是先确认下数据和服务器是否一致。也就是使用 etag 或者 last-modified 控制缓存。

    • no-store:所有内容都不缓存,不使用强缓存也不使用协商缓存。

    • max-age: 表示缓存内容在多久后失效。

    • s-maxage: 同 max-age,但是只在代理服务器生效(比如 cdn)。

    • max-stale: 能容忍的最大过期时间。

    • max-fresh: 能容忍的最小新鲜度。

    expires 是 HTTP 1.0 的产物,cache-control 是 HTTP 1.1 的产物,两者同时存在时,cache-control 优先级更高。从下图中可以发现强缓存浏览器加载速度超快,没有与服务器发生交互。


2.4、协商缓存

    强缓存判断缓存是否超出某个时间或者范围,但是不关心服务器是否已经更新内容。为了获取服务器更新,就需要使用协商缓存。

    协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器决定是否使用缓存。主要有 2 种情况:

  • 协商缓存生效,返回304和 no modified。

  • 协商缓存失效,返回200和请求结果。

    协商缓存通过 2 中 HTTP Heeader 设置:last-modified 和 etag。

2.4.1、last-modified和if-modified-since

    浏览器在第一次访问资源时,服务器返回资源的同时,在 响应头添加 last-modified,值是这个资源在服务器上的最后修改时间。
    浏览器下一次请求,服务器检测到 last-modified 的值,再添加个 if-modified-since 值是 last-modified 的值。服务器再次收到请求,会根据 last-modified-since 的值与服务器中这个资源的最后修改时间对比。相同 304,如果 if-modified-since 的值比服务器上资源最后修改时间小,返回新的资源和 200。
    last-modified 存在的弊端:

  • 如果在本地打开缓存文件,即使没有改内容,last-modified 也会被修改,服务器就不能命中缓存。

  • last-modified 只能以秒计时,如果在不可感知的时间内修改,服务器还是会认为命中缓存了。

  • 有的服务器文件没有修改,可能也会更新修改时间。

2.4.2、etag和if-none-match

    etag是服务器响应请求时,返回当前资源文件的一个唯一标识(由服务器生成,通常是文件的内容md5加上修改时间算法计算得出),只要资源有变化,etag 就会重新生成。
    浏览器下一次请求时,只需要把上一次 etag 的值写到 if-none-match 中,服务器再比较 if-none-match 和当前资源的 etag 是否一致。
    从下图中可知,协商缓存即使没有失效,也要请求一次服务器。

2.5、对比

    精度上,etag优于last-modified。Last-Modified的时间单位是秒,如果某个文件在1秒内改变了多次,那么他们的Last-Modified其实并没有体现出来修改,但是Etag每次都会改变确保了精度;如果是负载均衡的服务器,各个服务器生成的Last-Modified也有可能不一致。

  • 在性能上,Etag肯定要逊于Last-Modified,毕竟Last-Modified只需要记录时间,而Etag需要服务器通过算法来计算出一个hash值。

  • 在优先级上,服务器校验优先考虑Etag。

2.6、小结

    强缓存优先于协商缓存,若强缓存生效则直接使用缓存,若不生效使用协商缓存(last-modified/if-modified-since 和 etag/if-none-match)。协商缓存由服务器决定是否使用缓存。使用缓存返回 304,不使用 返回 200 和 新的资源。用一张图片总结:

三、应用

3.1、频繁变动的资源

cache-control: no-cache
通过设置 no-cache 使浏览器每次都请求服务器,然后配合使用 etag 或者 last-modified 协商缓存。

3.2、不常变化的缓存

cache-control: max-age=60480000

    通过设置一个很大的过期时间,浏览器就会使用强缓存。而为了解决更新的问题,就需要在文件名(或者路径)中添加 hash, 版本号等动态字符,之后更改动态字符,从而达到更改引用 URL 的目的,让之前的强制缓存失效 (其实并未立即失效,只是不再使用了而已)。

3.3、SPA页面

    现在前端三大框架项目通过打包工具打包出来的资源名通常都是资源的md5值计算出来的hash,如果资源不变hash都不会变,可以让我们有效的利用缓存。但是通常我们的静态资源都是通过放在nginx下,而一般我们的nginx项目对静态资源的缓存配置缓存了html页面的静态资源,大概配置如下:

location ~\.(css|js|png|jpeg|jpg|wepg|mp3|mp4|ogg|html)$ {expires 7d;
}

    这样会导致如果我们更改了文件内容,导致hash变化,但是由于html还是取得缓存,这样我们在发版的时候,缓存还未失效的用户可能访问的还是旧的缓存。导致用户不用第一时间看见最新版本,或者存在某些引用的资源缓存已经失效,但是文件内容被更改,此时资源路径可能在服务器上已经不存在,就会导致资源404。

    其实,通常SPA的首页index.html一般非常小,而其它页面都是前端路由,只是JS文件,我们针对SPA项目,可以不缓存html资源,针对其它文件则使用强缓存即可,这样可以提高页面加载速度。

location ~\.(html)$ {add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate";
}
location ~\.(css|js|png|jpeg|jpg|wepg|mp3|mp4|ogg)$ {expires 7d;
}

------ END ------

作者简介

李同学: 研发工程师,目前负责天际-移动平台的研发工作。

也许您还想看

记AWSS3在iOS端的一次改造事件

明源云创CI/CD技术演进

微前端架构在容器平台的应用

AI云店小程序演变之路

天眼探针基于rrweb实现前端异常视频录制与回放功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows2008应用之配置客户端自动添加打印机

打印机对我们每一个人来说都是习以为常的东西了,给你一条远程打印机共享路径,你只要轻轻的双击想安装的打印机图标,等上个三五秒打印机就安装好,这台打印机就任你摆布了。但相对我们IT人员来说,全面的自动化将是我们的…

现代CSS进化史

英文:Peter Jang 编译:缪斯segmentfault.com/a/1190000013191860CSS一直被web开发者认为是最简单也是最难的一门奇葩语言。它的入门确实非常简单——你只需为元素定义好样式属性和值,看起来似乎需要做的工作也就这样嘛!然而在一些…

一日一技:Ocelot网关使用IdentityServer4认证

概述Ocelot是一个用.NET Core实现的开源API网关技术。IdentityServer4是一个基于OpenID Connect和OAuth2.0的针对ASP.NET Core的框架,以中间件的形式存在。OAuth是一种授权机制。系统产生一个短期的token,用来代替密码,供第三方应用使用。下面…

php windows共享内存,关于php的共享内存的使用和研究之由起

最近遇到一个场景,服务寻址的时候,需要请求远程的服务,获取一批可用的ip和端口地址及其权重。根据权重和随机算法选择最合适的一个服务地址,进行请求。由于服务地址在短时间之内不会发生变化,因此为了避免无限制的进行…

联想继续为其硬件产品完善Linux支持

喜欢就关注我们吧!此前,联想曾宣布为其台式机/笔记本电脑预装 Fedora/Ubuntu 等 Linux 发行版。并通过与 RedHat 等达成合作,为 Linux 带来了更多的上游工作支持。时至今日,据 Phoronix 称,自联想开始提供 Linux 预装以…

Excel有哪些需要熟练掌握而很多人不会的技能!

看完这篇Excel攻略,你会感觉这么多年的excel都白学了!来自知乎用户“未央之末”的分享。从今年年初的excel盲,到现在经常从大拿那偷师,也算是成长了不少,慢慢写下来算是对学习excel做个短期回顾——1排版篇给他人发送e…

如何在 ASP.NET Core 中使用 LazyCache

微软的 ASP.NET Core 已经是一个非常流行的用于构建 高性能, 模块化 并能运行在 Windows, Linux, MacOS 上的 WEB 框架,通常能够让程序保持高性能的一个有效途径就是通过缓存热链上的数据来应对高频的请求。LazyCache 是一款基于内存的易于使用和线程安全的缓存组件…

2018全球大学AI排名发布,中国高校表现强势!

[导读] 近日,麻省理工学院马萨诸塞校区计算机与信息科学学院教授 Emery Berger 发布一个全球院校计算机科学领域实力排名的开源项目 CSranking 更新了。目前,卡耐基梅隆大学(CMU)、麻省理工学院(MIT)与斯坦…

在C#中使用 CancellationToken 处理异步任务

在 .NET Core 中使用异步编程已经很普遍了, 你在项目中随处可见 async 和 await,它简化了异步操作,允许开发人员,使用同步的方式编写异步代码,你会发现在大部分的异步方法中,都提供了CancellationToken参数…

通过Python实现马尔科夫链蒙特卡罗方法的入门级应用

通过把马尔科夫链蒙特卡罗(MCMC)应用于一个具体问题,本文介绍了 Python 中 MCMC 的入门级应用。GitHub 地址:https://github.com/WillKoehrsen/ai-projects/blob/master/bayesian/bayesian_inference.ipynb过去几月中,…

315曝光不良奸商 对企业不能罚酒三杯

3月15日,315晚会又曝光了一批无良奸商,虽然315晚会年年曝光,各地政府也迅速跟进打击,但侵害消费者权益的情况却屡见不鲜。从被曝光企业的道歉信来看,“承认错误只是个别问题全面排查整改配合管理部门执法向消费者表示道…

.NET 产品版权保护方案 (.NET源码加密保护)

一. 前言大家好,我是康世杰,大家可以叫我Jason。我和大家一样,都是搞技术出身,也未当过讲师,所以口材有限,如果讲得不好之处,还希望大家多多海含,谢谢。今天是我们第一次见面&…

java地图 热力图,腾讯地图数据可视化之热力图

前言数据可视化API(Web),是基于腾讯位置服务JavaScript API GL实现的专业地理空间数据可视化渲染引擎。 通过这套API,可以实现轨迹数据、坐标点数据、热力、迁徙、航线等空间数据的可视化展现。使用步骤1、注册成为腾讯位置服务开发者,并进入…

建模分析师与算法工程师的主要区别

大家晚上好,我是新来的实习生小模君,前几天小智老师给我科普了数据挖掘的基础知识,颇有收获,于是就趁小天今天有事休假冒个泡跟大家分享一番。数据挖掘,英文名叫Data mining,一般是指从大型数据库中将隐藏的…

Flurl使用Polly实现重试Policy

❝在使用Flurl作为HttpClient向Server请求时,由于网络或者其它一些原因导致请求会有失败的情况,比如HttpStatusCode.NotFound、HttpStatusCode.ServiceUnavailable、HttpStatusCode.RequestTimeout等;网络上有比较多的HttpClientFactory使用P…

推荐15个 JavaScript 和 CSS 库

Tutorialzine的使命是让开发者与最新的Web开发发展同步。因此,我们每月都会精选一批最优秀的资源推荐给大家,相信这些资源你绝对值得拥有!ClarifyJSClarifyJS可以让你串联一串方法,以任意顺序执行。通常的JavaScript方法是从左到右…

Dapr Meetup 3.22【周六】

点击蓝字关注我们Dapr(Distributed Application Runtime ,分布式应用运行时)是微软新推出的,一个可移植的、由事件驱动的运行时,用于跨云和边缘构建分布式应用程序。2019年10月9日,正式以 MIT 协议开源。…

日本老爷爷坚持17年用Excel作画,我可能用了假的Excel···

本文来源自网络说起办公软件Excel,不少人可能同小编一样,谈及色变。想想公式、表格头都大了,今天要介绍的这个人竟然可以用其作画,简直是大写的“丧心病狂”!这位传奇人物就是堀内辰男,今年已经77岁了&…

腾讯二面挂了,就因为这个...

牛年跳槽季,惨遭开门黑,谨以此文纪念我的首次腾讯面试经历。经我的老师,微软MVP大佬推荐,有幸拿到了腾讯.NET Core高开面试机会,二面却挂在一个最常见的问题上,“你上家公司电商平台的TPS、QPS是多少&#…

51CTO博客 NO.1 大奖赛之后感想---奖品

自从加入51cto技术成就梦想这个大家庭以来,进入这个大家庭可以说是个机会,也可以是个缘分;已经有半年了,明朗炽热般的心,使我深深地喜欢上了这一个大家庭;这个大家庭是一个很不平凡而又富有源源不断学而不尽…