当前位置: 首页 > news >正文

浏览器缓存详细介绍

浏览器缓存

缓存全过程

  • 浏览器第一次加载资源,服务器返回 200,浏览器从服务器下载资源文件,并缓存资源文件与 response header,以供下次加载时对比使用;
  • 下一次加载资源时,由于强制缓存优先级较高,先比较当前时间与上一次返回 200 时的时间差,如果没有超过 cache-control 设置的 max-age,则没有过期,并命中强缓存,直接从本地读取资源。如果浏览器不支持HTTP1.1,则使用 expires 头判断是否过期;
  • 如果资源已过期,则表明强制缓存没有被命中,则开始协商缓存,向服务器发送带有 If-None-Match 和 If-Modified-Since 的请求;
  • 服务器收到请求后,优先根据 Etag 的值判断被请求的文件有没有做修改,Etag 值一致则没有修改,命中协商缓存,返回 304;如果不一致则有改动,直接返回新的资源文件带上新的 Etag 值并返回 200;
  • 如果服务器收到的请求没有 Etag 值,则将 If-Modified-Since 和被请求文件的最后修改时间做比对,一致则命中协商缓存,返回 304;不一致则返回新的 last-modified 和文件并返回 200;

缓存位置

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

  1. Service Worker
  2. Memory Cache
  3. Disk Cache
  4. Push Cache
  5. 网络请求

缓存机制

缓存机制分为强缓存和协商缓存,并都是通过HTTP Header 实现

1. 强缓存

可以通过设置两种 HTTP Header 实现:Expires 和 Cache-Control 。强缓存表示在缓存期间不需要请求
Expires 是 HTTP/1 的产物,表示资源会在 Wed, 22 Oct 2018 08:41:00 GMT 后过期,需要再次请求。并且 Expires 受限于本地时间,如果修改了本地时间,可能会造成缓存失效。
Expires: Wed, 22 Oct 2018 08:41:00 GMT
Cache-Control 出现于 HTTP/1.1,优先级高于 Expires 。该属性值表示资源会在 30 秒后过期,需要再次请求。Cache-Control 可以在请求头或者响应头中设置,并且可以组合使用多种指令:
public:设置了该字段值的资源表示可以被任何对象(包括:发送请求的客户端、代理服务器等等)缓存。这个字段值不常用,一般还是使用max-age=来精确控制;
private:设置了该字段值的资源只能被用户浏览器缓存,不允许任何代理服务器缓存。在实际开发当中,对于一些含有用户信息的HTML,通常都要设置这个字段值,避免代理服务器(CDN)缓存;
no-cache:设置了该字段需要先和服务端确认返回的资源是否发生了变化,如果资源未发生变化,则直接使用缓存好的资源;
no-store:设置了该字段表示禁止任何缓存,每次都会向服务端发起新的请求,拉取最新的资源;
max-age=:设置缓存的最大有效期,单位为秒;
s-maxage=:优先级高于max-age=,仅适用于共享缓存(CDN),优先级高于max-age或者Expires头;
max-stale[=]:设置了该字段表明客户端愿意接收已经过期的资源,但是不能超过给定的时间限制

2. 协商缓存

  • 如果缓存过期了,就需要发起请求验证资源是否有更新。协商缓存可以通过设置两种 HTTP Header 实现:Last-Modified 和 ETag
  • 当浏览器发起请求验证资源时,如果资源没有做改变,那么服务端就会返回 304 状态码,并且更新浏览器缓存有效期。
    Last-Modified 和 If-Modified-Since
    Last-Modified 表示本地文件最后修改日期,If-Modified-Since 会将 Last-Modified 的值发送给服务器,询问服务器在该日期后资源是否有更新,有更新的话就会将新的资源发送回来,否则返回 304 状态码。
    Last-Modified 弊端:
  • 如果本地打开缓存文件,即使没有对文件进行修改,但还是会造成 Last-Modified 被修改,服务端不能命中缓存导致发送相同的资源,比如十天前缓存的文件,十天后没有修改只是打开了这个缓存文件,可能会被服务端认为没有命中缓存导致返回相同的资源
  • 时间精度不足, Last-Modified 只能以秒计时,如果在不可感知的时间内修改完成文件,那么服务端会认为资源还是命中了,不会返回正确的资源
  • 依赖系统时间,如果多个服务器之间的系统时间不一样,可能会影响判断资源是否更新

ETag 和 If-None-Match
ETag 类似于文件指纹,If-None-Match 会将当前 ETag 发送给服务器,询问该资源 ETag 是否变动,有变动的话就将新的资源发送回来。并且 ETag 优先级比 Last-Modified 高。

3. 如果什么缓存策略都没做,浏览器会怎么处理?

  • 对于这种情况,浏览器会采用一个启发式的算法,通常会取响应头中的 Date 减去 Last-Modified 值的 10% 作为缓存时间。
http://www.xdnf.cn/news/679303.html

相关文章:

  • API平台(API网关)的API监控预警机制
  • 欧几里得 ---> 裴蜀定理 ---> 拓展欧几里得
  • 使用MATLAB求解微分方程:从基础到实践
  • ProfiNet转MODBUSTCP网关模块的实时性保障Logix5000控制器与AltivarProcess变频器同步控制方案
  • 【leetcode】977. 有序数组的平方
  • Microbiome|基于MAG的宏转录组
  • TailwindCSS v4 快速入门教程
  • 在Linuxfb环境下利用海思TDE API实现高效的2D图形加速
  • Java中的日期类详解
  • 数据泄露频发,Facebook的隐私保护是否到位?
  • 12. CSS 布局与样式技巧
  • [网页五子棋][用户模块]数据库设计和配置(MyBatis)、约定前后端交互接口、服务器开发
  • 使用tunasync部署企业内部开源软件镜像站-Centos Stream 9
  • 用ChatGPT辅助UI设计:从需求分析到风格提案的提效秘籍
  • 代码随想录算法训练营第五十一天
  • Day4 记忆内容:priority_queue 高频操作
  • SAAS架构设计2-流程图-注册流程图
  • uni-app 中开发问题汇总
  • 【网络编程】十七、多路转接之 epoll
  • JAVA SE 文件IO
  • Python函数
  • python+tkinter实现GUI界面调用即梦AI文生图片API接口
  • PPO算法里clipfrac变量的作用
  • 《计算机组成原理》第 7 章 - 指令系统
  • 恶意npm与VS Code包窃取数据及加密货币资产
  • 科研级计算服务器 稳定支撑创新研究
  • 系统设计——项目设计经验总结3
  • int c =5; 代码解释
  • 《计算机组成原理》第 5 章 - 输入输出系统
  • 冒泡排序:像煮汤一样让数字「冒泡」