浏览器缓存机制详细知识点梳理

在前端的性能优化中,浏览器缓存是很重要的一环。比如在页面前进或者后退,发现丝毫不卡顿很流畅,就是缓存机制的力量。

一、什么是缓存

浏览器缓存Brower Caching是浏览器对之前请求过的文件进行缓存,以便再次访问的时候提高页面展示的速度。比如当我们第一次访问CSDN网站的时候,PC会把从网站上的图片和数据下载到电脑上。当再次访问CSDN网站的时候,网站直接从PC加载,这就是缓存。

二、为什么需要缓存?缓存有哪些优势?

(1)浏览器缓存是将文件保存在客户端,减少重复请求浪费网络带宽,只产生很小的网络消耗。

ps:打开本地资源也会产生网络消耗

(2)缓解服务器的压力,不用重复请求数据

(3)提升前端性能,提高访问速度,提供更好的用户体验

三、web缓存的类别

①数据库缓存

将查询后的数据放在内存中进行缓存,下次再查询,直接从内存缓存中获取,提高响应速度

②CDN缓存

发送web请求,cdn计算出路径短且快的路。管理员部署,把经常访问的放入cnd加快响应

③代理服务器缓存

与浏览器缓存机制类似,但代理服务器面向更广大的群体,规模更大。不只是为一个用户服务,而是为一群用户服务。

④浏览器缓存

每个浏览器都实现HTTP缓存。浏览器使用HTTP协议与服务器交互,根据与服务器约定的规则进行缓存工作

四、浏览器缓存的位置

浏览器缓存的位置一般为四类:Server Worker、Memory Cache、Disk Cache、Push Cache

五、浏览器缓存过程

浏览器缓存过程:强缓存、协商缓存

六、浏览器缓存判断流程图

第一次请求

再次请求

七、缓存位置

1、Server Worker

Server Worker 是运行在浏览器的独立线程,一般用来缓存。Server Worker 涉及请求拦截,so传输协议是HTTPS来保障安全。

Server Worker 是“外建”的缓存机制,可以自由控制缓存哪些文件、如何匹配缓存、如何读取缓存,并且缓存是持续性的,这是与其他内建缓存机制的区别。

2、Memory Cache

内存中的缓存,主要包含的是当前中页面中已经抓取到的资源,例如页面上已经下载的样式、脚本、图片等,占据该进程一定的内存资源,但是缓存持续性很短,会随着进程的释放而释放。一旦我们关闭 Tab 页面,内存中的缓存也就被释放了。

内存缓存特点:①读取速度快 ②时效性:页面关闭进程的内存清空释放

3、Disk Memory

硬盘中的缓存。在所有浏览器缓存中,Disk Cache 覆盖面基本是最大的,绝大部分的缓存都来自 Disk Cache。为什么呢?cuz根据 HTTP Herder 中的字段判断哪些资源需要缓存,哪些资源可以不请求直接使用,哪些资源已经过期需要重新请求。在跨站点的情况下,相同地址的资源一旦被硬盘缓存下来,就不会再次去请求数据。

硬盘缓存比内存缓存读取速度慢,读取需要对硬盘进行I/O操作,会导致重新解析缓存内容,造成读取路的复杂。

Memory Cache 和 Disk Cache的相同和不同比较

Memory Cache Disk Cache
相同点 只能存储一些派生类资源文件 只能存储一些派生类资源文件
不同点 退出Tag进程时数据会被清除 退出Tag进程时数据不会被清除
存储资源 一般脚本、图片、字体 一般非脚本css等

CSS文件加载一次就可以渲染,不会频繁的读取,存储在Disk Cache;js脚本可能会随时会被执行,存储在Memory Cache,若存储在硬盘中,会因为I/O开销大导致浏览器失去响应。

三级缓存原理

①先去内存查找,找到直接加载

②内存找不到,硬盘中找,找到直接加载

③硬盘找不到进行网络请求

④请求获取的资源缓存到硬盘和内存

prefetch cache 预取缓存

html代码的link标签带有prefetch,prefetch是预加载的一种方式,被标记为prefetch的资源会在浏览器空闲的时间加载

4、Push Cache

推送缓存,是HTTP/2的内容,并没有严格执行HTTP头部的缓存指令。在Server Worker、Memory Cache、Disk Cache都没有命中的时候,它会被使用。在Session中存在,Session结束就会被释放,缓存时间短暂。

八、强缓存

(1)HTTP报文

浏览器缓存机制就是HTTP缓存机制,这个机制HTTP报文的缓存标识进行的。

  • HTTP请求报文

请求行—HTTP行(通用信息头、请求头、实体头)—请求报文主体(post才有)

  • HTTP响应(Response)报文

状态行 – HTTP头(通用信息头,响应头,实体头) – 响应报文主体

(2)浏览器并不会向服务器发送任何请求,直接从本地缓存中读取文件,返回200
200 form memory cache 200 from disk cache
不访问服务器!直接从内存中获取。浏览器关闭,资源将被释放,数据将不存在。下次打开页面不是from memory cache 不访问服务器!直接从硬盘中获取。浏览器关闭,资源不会被释放,数据依然存在,下次打开页面依然是from disk cache

控制强制缓存的字段分别是Expires和Cache-Control,Cache-Control优先级比Expires高

(3)Expires

http1.0规范,它设置一个值绝对时间的GMT格式的时间字符串,这个是资源失效时间(客户端的时间小于Expires的值),在这个时间之前都是名中缓存。

Expires:Mon,16 Oct 2066 23:59:59 GMT

缺陷:Expires控制缓存原理是客户端的时间和服务端返回的时间作对比,若两个时间偏差大的话,会造成强制缓存直接失效

(4)Cache-Control

http1.1规范,替代Expires,它利用的是相对时间,利用header信息字段的max-age值判断。

max-age=5000//代表资源的有效期是5000秒

除此之外还有常见的几个值

public 可以被所有的用户缓存,包括终端用户和 CDN 等中间代理服务器
private 只能被终端用户缓存,不允许CDN等中间缓存器对其缓存(默认取值)
no-cache 客户端缓存,发送请求到服务器确实是否使用协商
no-store 禁止缓存,级禁止强缓存和协商缓存,每次都需要重新请求数据
max-age 缓存内容有效时间
(5)Expires和Cache-Control

Cache-Control的优先级比Expires高,Expires是绝对时间,Cache-Control是相对时间

九、协商缓存
(1)浏览器向服务器发起请求,命中缓存返回304,失效返回200和请求结果

向服务器发起请求,服务器根据这个请求的Request header的一些参数来判断是否命中协商缓存;命中返回304状态码并且会带上新的response header告诉浏览器可以从缓存中读取资源。没有命中返回200状态码和请求的结果。

(2)协商缓存成功,返回304流程图

(3)协商缓存失效,返回200流程图

(4)Last-Modified/If-Modified-Since、ETag/If-None-Match

协商换头字段Last-Modified/If-Modified-Since 和ETag/If-None-Match是成对出现的,呈现一一对应的关系

Last-Modified/If-Modified-Since 是http1.0的头字段,ETag/If-None-Match是http1.1的头字段

Etag / If-None-Match优先级高于Last-Modified / If-Modified-Since,同时存在则只有Etag / If-None-Match生效

一些概念

①Last-Modified

浏览器向服务器发送资源最后的修改时间

②If-Modified-Since

当资源过期时,发现响应头具有Last-Modified声明,则再次向服务器请求时带上头if-modified-since,表示请求时间。服务器收到请求后,发现有if-modified-since则与被请求资源的最后修改时间进行对比(Last-Modified),若最后修改时间较新,说明资源又被改过,则返回最新资源,返回200;若最后修改时间较小,说明资源无新修改,返回304 ,使用缓存文件。

③ETag

http1.1属性,由服务器生成返回给前端,帮助服务器控制web端的缓存验证,服务器会生成并且返回当前资源文件的一个唯一标识

④If-None-Match

当资源过期时,发现响应头具有Etag声明,则再次向服务器请求时带上头if-none-match(唯一标识Etag值)。服务器收到该请求后,发现有If-None-Match则根据If-None-Match的字段值与该资源在服务器的Etag值做对比,一致则返回304,代表资源无更新,继续使用缓存文件;不一致则重新返回资源文件,状态码为200。

Etag为什么会出现?

Last-Modified/If-Modified-Since有个缺陷,在短时间内变化,Last-Modified并不会发生变化。在周期性内变化,一个周期内修改为原来的样子,还是可以使用缓存,但是Last-Modified不是这么工作的,所以Etag出现了。

Last-Modify/If-Modify-Since 和ETag/If-None-Match的区别

  • Etag/If-None-Match 返回的是一个校验码,而Last-Modified/If-Modified-Since 不是。Etag可保证每一个资源的唯一性,资源变化Etag也会变化。服务器根据If-None-Match值来判断是否命中缓存
  • Last-Modifed/If-Modified-Since的时间精度是秒,而Etag可以更精确
  • Etag优先级高于Last-Modified,服务器先验证Etag;Etag可以和Last-Modified一起使用,服务器先验证Etag,一致才会继续比对last-Modified,最后才会返回304。
十、强缓存和协商缓存的区别

①强缓存不发送请求到服务器,协商缓存发送请求到服务器

②强缓存资源更新浏览器不知道,因为没有发送请求到服务器;协商缓存资源更新浏览器都知道,因为发送了请求到服务器

③大部分web默认用协商缓存

十一、总结

当浏览器再次访问一个资源

①看是否命中强缓存,命中使用强缓存

②没有命中强缓存,发送请求到服务器看是否命中协商缓存

③若命中协商缓存,服务器返回304告诉浏览器可以使用本地缓存

④没有命中协商缓存,返回最新的资源

十二、刷新对强缓存和协商缓存的区别

①当ctrl+f5强制刷新网页时,直接从服务器加载,跳过强缓存和协商缓存

②当f5刷新网页时,跳过强缓存,检查协商缓存

③浏览器地址栏中写入URL,不用请求直接走缓存,最快的速度

【一文就够】浏览器缓存机制详细知识点梳理相关推荐

  1. 一文搞懂浏览器缓存机制

    最近在项目中遇到了 IE浏览器因缓存问题未能成功向后端发送 GET类型请求 的bug,然后顺藤摸瓜顺便看了看缓存的知识,觉得有必要总结跟大家分享一下. 在前端开发中,性能一直都是被大家所重视的一点,然 ...

  2. 浏览器缓存机制详细图解

    原文地址请点击这里

  3. 前端必须要懂的浏览器缓存机制

    前端必须要懂的浏览器缓存机制 2017-10-11 腾讯NEXT学位 腾讯NEXT学位 腾讯NEXT学位 微信号 NextDegree 功能介绍 腾讯NEXT学位官方账号 本文详细讲解了浏览器端缓存的 ...

  4. 浏览器缓存机制(优化)

    浏览器缓存机制 缓存可以说是性能优化中简单⾼效的⼀种优化⽅式了,它可以显著减少⽹络传输所带来的损耗. 对于⼀个数据请求来说,可以分为发起⽹络请求.后端处理.浏览器响应三个步骤.浏览 器缓存可以帮助我们 ...

  5. 前端更新需要清空浏览器缓存_浏览器缓存机制分析及前端缓存清理

    浏览器缓存机制分析及前端缓存清理 发布时间:2018-06-03 16:56, 浏览次数:857 本文主题:理清浏览器的缓存机制的内部逻辑,并给出避免浏览器缓存的相关解决方案 相信很多新手前端发布页面 ...

  6. 浏览器会不会缓存html,浏览器缓存机制(一)

    浏览器缓存机制之一(经典缓存) 因为在接手的项目中用到过比较新的HTML5应用缓存,也用到了经典的缓存如设置max-age,Etag之类,而之前一直就是在用着没有去深究其中原理.周末天气不好,懒得出去 ...

  7. WEB请求过程(http解析,浏览器缓存机制,域名解析,cdn分发)

    WEB请求过程(http解析,浏览器缓存机制,域名解析,cdn分发) 目录 WEB请求过程(http解析,浏览器缓存机制,域名解析,cdn分发) 概述 HTTP解析 HTTP请求头 HTTP响应头 H ...

  8. 浏览器缓存机制(1)

    浏览器缓存机制之一(经典缓存) 因为在接手的项目中用到过比较新的HTML5应用缓存,也用到了经典的缓存如设置max-age,Etag之类,而之前一直就是在用着没有去深究其中原理.周末天气不好,懒得出去 ...

  9. 浏览器缓存机制学习总结

    浏览器缓存机制学习总结 最近在做一个考试系统时,由于经常加载试卷或图片等等静态资源,抽空学习了一下缓存机制,在此记录 为什么要使用缓存 1.通过HTTP协议,在客户端和浏览器建立连接时需要消耗时间,而 ...

最新文章

  1. (2)java基础继承
  2. oracle数据导入-dblink方式
  3. 关于 ADB 实现的说明
  4. Leet Code OJ 388. Longest Absolute File Path [Difficulty: Medium]
  5. SpringBootAdmin服务端
  6. pb 调用虹软_python调用虹软2.0
  7. 计算机视觉与图像处理面试题,深度学习图像处理算法工程师面试题
  8. 2018,广东,深圳马峦山游玩攻略(含登山线路)
  9. JavaScript DOM编程艺术第一章:JavaScript简史
  10. 富文本编辑器KindEditor在前端JS的应用
  11. 在线协作平台「蓝湖」完成5亿元C轮融资,多元化产品布局提升产品研发效率...
  12. oracle用户密码规则,使用Oracle自带profile以及函数简单设定Oracle用户名密码规则...
  13. java json jquery_JQuery提交JSON string数据
  14. 顶级期刊Nature、Science,如何一较高下?
  15. ios微信抓https包提示证书安全警告解决办法
  16. FANUC机器人的移动速度范围(仅供参考)
  17. 原始投资100美元,C语言实现单利息投资和复合利息投资
  18. Spring Security 鉴权流程
  19. 关于旁路电容的深度对话(重量级资料),收藏!
  20. java计算机毕业设计消防安全应急培训管理平台源码+系统+数据库+lw文档+mybatis+运行部署

热门文章

  1. 【Win10/11远程桌面Win7你的凭据不工作疑难杂症】
  2. Java:程序包不存在解决方案
  3. C++程序设计-第15周数组上机实践项目
  4. R语言使用dplyr包的summarise函数计算dataframe数据中指定(特定)数据列的移动平均值
  5. 《HFSS 电磁仿真设计 从入门到精通》笔记 HFSS T波导优化分析
  6. java map分组_java8快速实现List转map 、分组、过滤等操作
  7. 将字符串中的小写字母换成大写字母
  8. timeit 模块详解(准确测量小段代码的执行时间)
  9. R游程检验(Runs Test)
  10. 利用指针求向量乘积C语言,c – 通过指针在函数之间传递向量