HTTP缓存

前言

当我们访问浏览器网址的时候,浏览器会加载各种资源(如HTML、CSS、JS、图片等)。如果网络环境不是很好,首次加载该网址的响应是相对较慢的,后续的访问却会快很多。这就是浏览器缓存带来的性能优化了。那么我们就去了解一下浏览器缓存(HTTP缓存)

一、缓存目的

a)减少网络请求次数,降低服务器压力,提高网页加载速度

b)提升网页加载速度,提高用户体验

二、缓存流程

客户端首次请求: : 向服务器发起HTTP请求
服务端响应: : 服务器收到请求后,返回资源数据,并根据缓存策略返回响应标头。通过Cache-Control指定缓存, Expiresmax-ageage控制缓存时间,ETag控制版本等
客户端再次请求相同资源: : 检测是否有强缓存,有效直接使用缓存的副本

a) 强缓存失效则通过协商缓存: : 使用ETagIf-None-MatchLast-ModifiedIf-Modified-Since判断是否有效

a1) 协商缓存-有效: : 服务器返回304 复用缓存副本

a2) 协商缓存-无效: : 服务器返回数据资源,缓存该资源的新副本

为了更直白详细的展示,我们给缓存的流程画一个流程图

三、缓存类型

如上缓存流程图所示, 缓存分为 强缓存协商缓存

1. 强缓存(Strong Cache)

强缓存不会向服务器发送请求,直接从缓存中读取资源 主要通过设置HTTP响应头中的ExpiresCache-Control来控制

Cache-Control (HTTP/1.1 优先级高于Expires)

常用指令 说明 参数值
max-age= 缓存有效期(单位:秒) 必填,eg: max-age=3600 表示缓存有效期为1小时
no-cache 不使用强缓存,但响应头中会包含缓存标识,用于协商缓存 同Pragma(HTTP/1.0): no-cache -
no-store 完全禁止缓存(强制进入重新请求阶段) -
public 浏览器和代理服务器都可以缓存 -
private 仅允许浏览器缓存(默认) -
immutable 永远不会改变可以加上该参数,谨慎使用 -

Expires (HTTP/1.0遗留字段)

Expires: 指定资源过期时间 eg: Expires: Wed, 15 Apr 2026 03:19:25 GMT

问题: 判断缓存是否过期依赖本地时间,意味着可以通过修改客户端本地时间让缓存延期

2. 协商缓存(Negotiate Cache)

强缓存失效时,浏览器携带验证信息向服务器确认资源是否变化

ETag(优先级高于Modified)/If-None-Match

ETag: 服务器返回资源的唯一标识符(哈希值)

参数: W/hash ETag: W/"6800ea08-18e8b" 或 hash ETag: "6800ea08-18e8b"

  • W/标识: 对大小写敏感,表示使用弱验证器
If-None-Match: 请求标头版本号

浏览器下次请求时携带该标识(浏览器在请求资源时附加的上次请求资源时服务器返回的ETag) 用于和服务器的ETag比较

Last-Modified/If-Modified-Since

Last-Modified 响应标头

服务器返回资源时附加最后修改时间 eg: Last-Modified: Wed, 09 Apr 2025 02:50:59 GMT

If-Modified-Since 请求标头

浏览器在请求资源时附加上次请求资源时服务器返回的最后修改时间 eg: If-Modified-Since: Wed, 09 Apr 2025 02:50:59 GMT

四、缓存存储位置分类

1.浏览器端存储

内存缓存(Memory Cache) :临时存储高频资源,随标签页关闭释放

  • 优先存储 高频的小型资源(eg: JS/CSS), 速度快,但容量有限

磁盘缓存(Disk Cache)‌:持久化存储低频资源,重启后仍有效‌

  • 存储低频或较大资源(如图片),容量更大且持久化‌

Service Worker缓存‌:通过脚本独立管理缓存,需HTTPS协议支持

2.网络层

代理服务器/CDN缓存‌ :由Cache-Control: public控制,允许中间节点缓存资源
HTTP/2推送缓存(Push Cache)‌:会话级临时存储,有效期约5min

缓存优先级: Service Worker 缓存 > 内存缓存 > 磁盘缓存 > HTTP/2 推送缓存(Push Cache)

五、缓存的分类

HTTP Caching 标准中,有两种不同类型的缓存:私有缓存共享缓存
私有缓存

私有缓存是绑定到特定客户端的缓存------通常是浏览器缓存。由于存储的响应不与其他客户端共享,因此私有缓存可以存储该用户的个性化响应

共享缓存

共享缓存位于客户端和服务器之间,可以存储能在用户之间共享的响应。共享缓存可以进一步细分为代理缓存和托管缓存 有兴趣的可以更多参考

相关推荐
程序员秘密基地5 分钟前
基于html,css,vue,vscode,vs2022,asp.net,aspnet,.net,c#,mysql数据库,在线健身,俱乐部管理系统
前端·vue.js·后端·mysql·asp.net
Mintopia8 分钟前
Three.js 画布纹理:像素世界的魔法编织术
前端·javascript·three.js
天天摸鱼的java工程师8 分钟前
当我成为面试官,我才知道当年那些面试官其实并不是在难为我,而是在考察我面对问题的拆解能力
前端·后端·面试
袁煦丞11 分钟前
泰拉瑞亚远程联机魔法:cpolar内网穿透实验室第617个成功挑战
前端·程序员·远程工作
玲小珑15 分钟前
Next.js 教程系列(十二)API Routes:构建轻量级后端服务
前端·next.js
JinSo20 分钟前
EasyEditor AI 聊天助手:让低代码开发更简单
前端·javascript·github
答案answer24 分钟前
three.js 实现几个炫酷的粒子特效(火焰,烟雾,烟花)
前端·three.js
ObjectX前端实验室39 分钟前
三年写了很多代码,也想写写自己
前端·程序员
满分观察网友z1 小时前
uniapp的navigator跳转功能
前端
江城开朗的豌豆1 小时前
Vue组件DIY指南:手把手教你玩转自定义组件
前端·javascript·vue.js