由浅入深地讲清楚浏览器缓存

一、什么是浏览器缓存?(入门级)

1. 浏览器缓存的定义

浏览器缓存就是:浏览器把之前请求过的资源保存起来,下次访问同样的资源时可以直接用本地副本,而不是重新请求服务器。

举个生活例子

  • 你第一次去咖啡店买咖啡(访问网页)
  • 店员记住了你的订单(浏览器缓存资源)
  • 你下次来时,店员直接把咖啡给你,不用重新制作(直接用缓存)

2. 浏览器缓存的作用

  1. 加快访问速度(本地读取比网络快得多)
  2. 减少流量消耗(尤其移动端用户体验更好)
  3. 降低服务器压力(减少重复请求)

面试官问:

浏览器缓存的作用和好处是什么?

你可以答:

它可以减少网络请求、提高页面加载速度,并降低服务器压力。


二、浏览器缓存的分类(核心概念)

浏览器缓存分为两大类:

1️⃣ 强缓存(强制缓存)

  • 特点:浏览器直接使用本地缓存,不请求服务器。

  • 触发条件

    • 服务器在响应头里设置了:

      • Cache-Control: max-age=秒数
      • 或旧版本 Expires: 绝对时间
  • 表现

    • 浏览器控制台 Status 显示 200 (from disk/memory cache)

例子

HTTP/1.1 200 OK
Cache-Control: max-age=31536000

2️⃣ 协商缓存(对比缓存)

  • 特点:浏览器会先问服务器:

    “我本地有缓存,你那边更新过吗?”

  • 流程

    1. 浏览器带上缓存标识(If-Modified-SinceIf-None-Match

    2. 服务器对比:

      • 如果没更新 → 返回 304 Not Modified,浏览器用本地缓存
      • 如果更新了 → 返回新资源,状态码 200
  • 相关响应头

    • Last-Modified / If-Modified-Since
    • ETag / If-None-Match

3️⃣ 优先级总结

  • 浏览器访问资源的顺序:

    先检查强缓存 → 命中直接用本地↓否则检查协商缓存↓再决定请求新资源
    

一句话记忆

强缓存不发请求,协商缓存要问服务器。


三、浏览器缓存的实际应用(进阶)

在真实开发中,不同资源适合不同缓存策略:

1. 静态资源(JS、CSS、图片)

  • 策略:强缓存 + 文件名 hash

  • 原因

    • 这些文件内容很少改
    • 文件名带 hash,更新后浏览器会认为是新文件

示例

app.91a2d3.js
Cache-Control: max-age=31536000

2. HTML 文件

  • 策略:协商缓存或短期缓存

  • 原因

    • HTML 更新频繁,不能强缓存太久,否则用户看不到最新版本
  • 示例

    Cache-Control: no-cache
    ETag: "page12345"
    

3. 接口请求(API 数据)

  • 策略

    • 经常变动的数据 → 禁用缓存或加时间戳
    • 稳定数据(城市列表、字典表)→ 协商缓存或自定义缓存逻辑

示例

fetch(`/api/user?id=1&_=${Date.now()}`) // 防止缓存

四、浏览器缓存相关的面试高频题(核心)

面试官最喜欢问这些:

  1. 浏览器缓存有哪些类型?

    • 强缓存(Cache-Control / Expires
    • 协商缓存(ETag / Last-Modified
  2. 强缓存和协商缓存的区别?

    • 强缓存命中 → 不发请求
    • 协商缓存命中 → 发请求但返回 304
  3. Cache-Control 常见指令?

    • max-age:缓存时长(秒)
    • no-cache:不直接用缓存,需要协商
    • no-store:完全禁用缓存
    • immutable:资源永远不会变(适合版本化静态资源)
  4. ETag 和 Last-Modified 区别?

    • Last-Modified:按最后修改时间判断
    • ETag:按文件内容 hash 判断,精度更高
  5. 实际开发如何设计缓存策略?

    • 静态资源:强缓存 + hash
    • HTML:协商缓存
    • 接口:按业务决定缓存策略

五、答题模板(背会就能面)

如果面试官问:

讲一下浏览器缓存原理?

你可以这样答:


① 先分类

浏览器缓存分为两类:强缓存和协商缓存。
强缓存命中时直接使用本地缓存,不发请求。
协商缓存会向服务器确认资源是否更新,如果未更新返回 304。

② 说明原理

浏览器先查强缓存(Cache-Control / Expires),
命中直接用本地;
否则走协商缓存(ETag / Last-Modified),
服务器确认没更新则返回 304,否则返回新资源。

③ 再讲应用场景

实际开发中:

  • 静态资源(JS、CSS、图片)用强缓存 + 文件 hash
  • HTML 页面用协商缓存
  • 接口数据根据业务选择缓存或加时间戳避免缓存

④ 强调好处

这样能显著提升页面性能、减少带宽和服务器压力。

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

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

相关文章

Linux I/O 多路复用机制对比分析:poll/ppoll/epoll/select

Linux I/O 多路复用机制对比分析:poll/ppoll/epoll/select 1. 概述 I/O 多路复用是现代高性能网络编程的核心技术,它允许单个线程同时监视多个文件描述符的状态变化,从而实现高效的并发处理。Linux 提供了多种 I/O 多路复用机制&#xff0c…

高防服务器租用:保障数据安全

您的网络速度是否卡顿,业务是否经常受到网络攻击的威胁呢?别担心,高防服务器租用能够帮助你解决这些困扰!高防服务器租用拥有着卓越的防御能力,可以帮助企业抵御各种网络攻击,能够轻松化解各种超大流量的网…

基于python多光谱遥感数据处理、图像分类、定量评估及机器学习方法应用

基于卫星或无人机平台的多光谱数据在地质、土壤调查和农业等应用领域发挥了重要作用,在地质应用方面,综合Aster的短波红外波段、landsat热红外波段等多光谱数据,可以通过不同的多光谱数据组合,协同用于矿物信息有效提取。第一&…

CSS content-visibility:提升页面渲染性能的 “智能渲染开关”

在前端开发中,你是否遇到过这样的问题:页面包含大量 DOM 元素(如长列表、复杂表格)时,滚动变得卡顿,交互响应迟缓?这往往是因为浏览器需要不断渲染屏幕外的元素,浪费了大量计算资源。…

Javascript面试题及详细答案150道之(016-030)

《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs&…

仿真电路:(十七下)DC-DC升压压电路原理简单仿真

1.前言 升压的环境用的没降压的多,但是升压会用在LED的很多电路上,所以理解一下原理 2.DC-DC升压原理简单仿真 升压原理 下面还是对升压进行简单的仿真 拓扑结构以及原理和降压还是很相似的,只是位置不太一样,过程推导就不推导…

ros2--source

setup脚本类型 install下面会有几个setup.xxx的shell脚本。 setup.bash setup.ps1 setup.sh setup.zsh 什么区别呢 文件名 Shell 类型 适用场景 setup.bash Bash (Linux/macOS) 标准 Linux/macOS 终端(默认使用) setup.sh 通用 Shell 兼容性更广,但功能可能受限 setu…

40.MySQL事务

1.事务的作用事务用于保证数据的一致性,它由一组相关的 dml (update delete insert) 语句组成,该组的 dml (update delete insert) 语句要么全部成功,要么全部失败。如:转账就要用事务来处理,用以保证数据的一致性。假…

java导入pdf(携带动态表格,图片,纯java不需要模板)

java导出pdf文件一、介绍二、准备三、实现效果四、代码一、介绍 上一篇文章(java使用freemarker操作word(携带动态表格,图片))https://blog.csdn.net/weixin_45853881/article/details/129298494 紧跟上文&#xff0c…

【dropdown组件填坑指南】鼠标从触发元素到下拉框中间间隙时,下拉框消失,怎么解决?

开发dropdown组件填坑之hideDelay 引言 在开发下拉菜单(dropdown)或弹出框(popover)组件时,一个常见的用户体验问题就是鼠标移出触发区域后,弹出内容立即消失,这会导致用户无法移动到弹出内容上…

Linux I/O 函数完整清单

Linux I/O 函数完整清单 1. 基础 I/O 函数 1.1 基本读写 #include <unistd.h>ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, const void *buf, size_t count);1.2 位置指定读写 #include <unistd.h>ssize_t pread(int fd, void *buf, siz…

面经——电子电路技术知识详解

电子电路技术知识详解 目录 德摩根定律周期性矩形波产生方法自激振荡器原理与设计晶体管温度效应分析反向饱和电流影响因素放大电路负反馈类型判断正弦波90相移电路直接耦合放大器的缺点二阶有源低通滤波器分析开关电源与线性电源对比 德摩根定律 德摩根定律&#xff08;De …

docker 安装 gitlab

null文章浏览阅读445次。问题&#xff1a;运行 docker run hello-world 报错。原因&#xff1a;原镜像源网络不稳定。https://blog.csdn.net/sszdzq/article/details/145733419 镜像获取 在线下载 docker pull gitlab/gitlab-ce:17.11.1-ce.0 离线获取 创建运行 sudo docke…

PHP中的日期/时间处理之Carbon组件

日常开发中&#xff0c;我们会经常用到日期和时间的操作&#xff0c;但官方的一般操作比较复杂&#xff0c;需要大量的时间进行格式化问题和大量计算等等。Carbon组件 可以帮助我们在 PHP 开发中处理日期/时间变得更加简单、更语义化&#xff0c;从而使得我们的代码更容易阅读和…

学习嵌入式第十八天

文章目录1.数据结构1.概念2.衡量代码质量和效率1.时间复杂度2.空间复杂度3.数据结构分类1.逻辑结构2.存储结构3.常见的数据结构2.链表1.与顺序表的区别2.链表分类1.单向链表1.定义链表节点类型2.空链表的创建3.链表的头插法4.链表的遍历5.链表元素删除3.makefile习题1.数据结构…

基于SpringBoot+Vue实现校园商铺系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参…

从资源闲置到弹性高吞吐,JuiceFS 如何构建 70GB/s 吞吐的缓存池?

AI 模型的训练与推理对存储系统提出了极为严苛的要求&#xff0c;特别是在高吞吐、高并发以及对海量小文件的高效处理方面&#xff0c;已成为三大主要挑战。尽管基于 Lustre 或 GPFS 的并行文件系统具备出色的性能&#xff0c;但其成本高昂、吞吐能力与容量强耦合&#xff0c;可…

提升JVM性能之CMS垃圾回收器的优化分析与案例剖析

这里写目录标题一、CMS基本介绍二、CMS核心优化策略1. 避免并发模式失败&#xff08;Concurrent Mode Failure&#xff09;2. 减少内存碎片3. 调优并发阶段耗时4. 新生代优化配合三、典型案例解析案例1&#xff1a;电商服务频繁Full GC案例2&#xff1a;金融交易系统碎片导致长…

Token系列 - 再谈稳定币

相关政策 2024年12月&#xff0c;欧洲《加密资产市场监管法案》正式成为法律2025年3月&#xff0c;日本细化了加密资产及稳定币的监管调整2025年5月&#xff0c;英国发布了关于稳定币发行、加密资产托管及加密资产公司财务稳健性的监管提案&#xff1b;2025年5月20日&#xff…

【20min 急速入门】使用Demucs进行音轨分离

创建环境 conda create --name mujica python3.10下载加速依赖 先用nvidia-smi检查机器使用的独显版本, 然后从pytorch官网下载对应的GPU版torch, torchaudio 比如我的是12.2, 就下载11.8版本的 pip3 install torch torchvision torchaudio --index-url https://download.p…