文章目录

  • 分类
    • memory cache
    • disk cache
    • Service Worker
    • Push Cache
  • 缓存过程
    • 强缓存
      • 1、Expires
      • 2、Cache-Control
      • Expires 和 Cache-Control 的差别
    • 协商缓存
      • Last-Modified和If-Modified-Since
      • ETag和If-None-Match
      • 协商缓存的两者对比
  • 实际使用策略
  • 用户行为如何触发缓存
  • 参考资料

分类

从缓存位置上来说分为四种:

  • Service Worker
  • Memory Cache
  • Disk Cache
  • Push Cache

如果以上四种缓存都没有命中的话,那么只能发起请求来获取资源了。

memory cache

Memory Cache 也就是内存中的缓存

优点:
读取速度快

缺点:
一旦我们关闭 Tab 页面,内存中的缓存也就被释放了。

如何触发:
当我们访问过页面以后,再次刷新页面,可以发现很多数据都来自于内存缓存

disk cache

Disk Cache 也就是存储在硬盘中的缓存

优点:
缓存再硬盘中,容量大

缺点:
读取速度满

如何触发:
根据浏览器请求头

浏览器会把哪些文件丢进内存中?哪些丢进硬盘中?
关于这点,网上说法不一,不过以下观点比较靠得住:
对于大文件来说,大概率是不存储在内存中的,反之优先
当前系统内存使用率高的话,文件优先存储进硬盘

Service Worker

  • Service Worker 是运行在浏览器背后的独立线程,一般可以用来实现缓存功能。
  • 传输协议必须为 HTTPS
  • Service Worker 的缓存与浏览器其他内建的缓存机制不同,它可以让我们自由控制缓存哪些文件、如何匹配缓存、如何读取缓存,并且缓存是持续性的。

这个我们不常用

Push Cache

  • Push Cache(推送缓存)是 HTTP/2 中的内容,当以上三种缓存都没有命中时,它才会被使用。
  • 它只在会话(Session)中存在,一旦会话结束就被释放,并且缓存时间也很短暂

这个我们不常用

缓存过程


根据是否需要向服务器重新发起HTTP请求将缓存过程分为两个部分,分别是强缓存和协商缓存。

强缓存

不会向服务器发送请求,直接从缓存中读取资源。

在chrome控制台的Network选项中可以看到该请求返回200的状态码,并且Size显示from disk cache或from memory cache。

强缓存可以通过设置两种 HTTP Header 实现:Expires 和 Cache-Control。

1、Expires

缓存过期时间,用来指定资源到期的时间,是服务器端的具体的时间点。

2、Cache-Control

比如:Cache-Control:max-age=300 时,则代表在这个请求正确返回的5分钟内再次加载资源,就会命中强缓存。

Expires 和 Cache-Control 的差别

其实这两者差别不大,区别就在于 Expires 是http1.0的产物,Cache-Control是http1.1的产物,两者同时存在的话,Cache-Control优先级高于Expires;在某些不支持HTTP1.1的环境下,Expires就会发挥用处。所以Expires其实是过时的产物,现阶段它的存在只是一种兼容性的写法。

强缓存判断是否缓存的依据来自于是否超出某个时间或者某个时间段,而不关心服务器端文件是否已经更新,这可能会导致加载文件不是服务器端最新的内容,那我们如何获知服务器端内容是否已经发生了更新呢?此时我们需要用到协商缓存策略。

协商缓存

协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程,主要有以下两种情况:

  1. 协商缓存生效,返回304和Not Modified
  2. 协商缓存失效,返回200和请求结果

    协商缓存可以通过设置两种 HTTP Header 实现:Last-Modified 和 ETag 。

Last-Modified和If-Modified-Since

Last-Modified 指的是这个资源在服务器上的最后修改时间

浏览器下一次请求这个资源,浏览器检测到有 Last-Modified这个header,于是添加If-Modified-Since这个header,值就是Last-Modified中的值;服务器再次收到这个资源请求,会根据 If-Modified-Since 中的值与服务器中这个资源的最后修改时间对比,如果没有变化,返回304和空的响应体,直接从缓存读取,如果If-Modified-Since的时间小于服务器中这个资源的最后修改时间,说明文件有更新,于是返回新的资源文件和200

弊端:

  • 如果本地打开缓存文件,即使没有对文件进行修改,但还是会造成 Last-Modified 被修改,服务端不能命中缓存导致发送相同的资源
  • 因为 Last-Modified 只能以秒计时,如果在不可感知的时间内修改完成文件,那么服务端会认为资源还是命中了,不会返回正确的资源

既然根据文件修改时间来决定是否缓存尚有不足,能否可以直接根据文件内容是否修改来决定缓存策略?所以在 HTTP / 1.1 出现了 ETag 和If-None-Match

ETag和If-None-Match

Etag是服务器响应请求时,返回当前资源文件的一个唯一标识(由服务器生成),只要资源有变化,Etag就会重新生成。

协商缓存的两者对比

精度:Etag 要优于 Last-Modified。
性能:Last-Modified 要优于 Etag。
优先级:服务器校验优先考虑Etag

实际使用策略

对与频繁变动的资源:
使用 Cache-Control: no-cache,使浏览器每次都请求服务器,然后配合 ETag 或者 Last-Modified 来验证资源是否有效。这样的做法虽然不能节省请求数量,但是能显著减少响应数据大小。

对于不常变化的资源:
通常在处理这类资源时,给它们的 Cache-Control 配置一个很大的 max-age=31536000 (一年),这样浏览器之后请求相同的 URL 会命中强制缓存。而为了解决更新的问题,就需要在文件名(或者路径)中添加 hash, 版本号等动态字符,之后更改动态字符,从而达到更改引用 URL 的目的,让之前的强制缓存失效 (其实并未立即失效,只是不再使用了而已)。

用户行为如何触发缓存

  • 打开网页,地址栏输入地址: 查找 disk cache 中是否有匹配。如有则使用;如没有则发送网络请求。
  • 普通刷新 (F5):因为 TAB 并没有关闭,因此 memory cache 是可用的,会被优先使用(如果匹配的话)。其次才是 disk cache。
  • 强制刷新 (Ctrl + F5):浏览器不使用缓存,因此发送的请求头部均带有 Cache-control: no-cache(为了兼容,还带了 Pragma: no-cache),服务器直接返回 200 和最新内容。

参考资料

https://mp.weixin.qq.com/s?__biz=Mzk0MDMwMzQyOA==&mid=2247492849&idx=1&sn=e504a9c18fec71b9644820edf4d94f68&chksm=c2e111daf59698ccf7e546319df00e67dd9406f79477b43c089b38492b533c6ee61b9765e28d&token=1388359418&lang=zh_CN&scene=21#wechat_redirect

浏览器缓存:memory cache、disk cache、强缓存协商缓存等概念相关推荐

  1. 缓存存在那些位置?缓存位置可分Service Worker、Memory Cache、Disk Cache、Push Cache四种

    从缓存位置上来说分为四种,并且各自有优先级,当依次查找缓存且都没有命中的时候,才会去请求网络. Service Worker Memory Cache Disk Cache Push Cache Se ...

  2. 内存缓存(from memory cache)和硬盘缓存(from disk cache) 的区别

    引言 ?命中强制缓存时,资源会显示 from memory cache or from disk cache 两者的区别 内存缓存(from memory cache) 内存缓存具有两个特点,分别是快 ...

  3. 浏览器Disk Cache磁盘缓存及其协商缓存、及原生App和浏览器实现缓存的差异

    浏览器Disk Cache磁盘缓存及其协商缓存.及原生App和浏览器实现缓存的差异 目录 浏览器Disk Cache磁盘缓存及其协商缓存.及原生App和浏览器实现缓存的差异 1.Memory Cach ...

  4. 浏览器from memory cache 和 from disk cache

    最近做的项目有个关于页面缓存的问题需要解决,问题的大致情况就是项目每次上线后,用户那边不知道版本已经更新了操作的页面还是旧的内容,这样就带来了很多次生问题,每次都要去通知版本更新了让用户手动去刷新一下 ...

  5. 禁用http请求缓存from disk cache

    实际用途 本人在做一个资讯交流类的vue项目中,有一个需求是点击资讯的删除按钮,将会删除这条资讯,听起来很简单,点击删除后,带上id去请求删除的接口,并将dom删除,但是问题来了,我确实删了这条资讯, ...

  6. 浏览器缓存——强缓存、协商缓存

    目录 浏览器缓存:强缓存.协商缓存 #强缓存 #协商缓存 #补充 #拓展 浏览器缓存:强缓存.协商缓存 区别:强缓存不向服务器发送请求,协商缓存会发送请求至服务器 相同点:若命中,都直接从浏览器缓存加 ...

  7. 浏览器缓存机制(强缓存和协商缓存)总结

    文章目录 前言 缓存过程的分析 强缓存 Expires Cache-Control 协商缓存 Last-Modified和If-Modified-Since ETag和If-None-Match 两者 ...

  8. Http强缓存和协商缓存

    文章目录 一.缓存介绍 1.什么是缓存? 2.为什么需要缓存? 3.哪些资源可以被缓存?--静态资源(css.js.img) 二.强制缓存 1.定义: 2.设置强缓存的方式 Expires & ...

  9. 浏览器协商缓存与强制缓存经典版

    浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的缓存标识进行的,所以在分析浏览器缓存机制之前,我们先使用图文简单介绍一下HTTP报文,HTTP报文分为两种: HTTP请求(R ...

最新文章

  1. android应用课程设计报告,基于Android的多媒体播放器课程设计报告.doc
  2. 【转载】如何做一份突出的PPT
  3. cJSON使用教程(树外构建 out of tree build 概念)(组包概念)
  4. 笔试题??智商题??(一)
  5. (待解)静态构造器和静态字段调用的相互嵌套
  6. log4j平稳升级到log4j2
  7. 互联网晚报 | 2月18日 星期五 | 高途宣布停止高中学科辅导服务;小红书启动最严医美专项治理;FF 91量产版2月23日发布...
  8. B3log 分布式社区的 Java 博客端节点系统
  9. LeetCode ——24. 两两交换链表中的节点
  10. HTML编辑器-Bluefish 2.0.1 发布
  11. 串行通信——异步串行通信
  12. 旭宇同创:拼多多怎么开通直通车?
  13. wpsword怎样涂黑方框_Excel中如何插入空心小方块和实心小方块的标志?
  14. 给view添加单边阴影
  15. variant 类型
  16. sql 条件查询以及模糊查询
  17. iTunes Connect 人员如何使用testflight安装测试版ios应用
  18. 在线机器学习算法及其伪代码
  19. Java统计字符串中字符重复次数
  20. 聊一聊 C++ 中的 namespace

热门文章

  1. developerWorks Java技术:十周年
  2. 系统集成项目管理工程师:供应商项目立项
  3. 练习:仿真模拟福彩双色球——中500w巨奖到底有多难?跑跑代码就晓得了。
  4. 王牌竞速服务器维护,王牌竞速攻略大全 新手入门少走弯路[多图]
  5. 阿里云平台微信告警(基于收费平台)
  6. chm文件打开是空白的
  7. 开发调试工具:USB转IIC/I2C/SPI/UART适配器模块可编程开发板
  8. 【无标题】鱼池转发命令
  9. 四款让你绝对上瘾的手机APP 用一次就会爱不释手
  10. 胡适先生给中国公学十八年级毕业赠言:要防御两方面的堕落