前端缓存【web缓存】

article/2025/3/14 15:10:02

前端缓存--http缓存

    • web缓存
      • http缓存
        • 定义
        • 优点
        • 缺点
        • http缓存类型
      • 强缓存
        • Expires实现的强缓存
        • Cache-control实现的强缓存
      • 协商缓存
        • last-modified实现的协商缓存
        • ETag实现的协商缓存
          • 缺点
      • 设置缓存
      • 文件缓存(html、js、css、png)
      • 总结

web缓存

web缓存主要指:浏览器缓存http缓存

http缓存是web缓存的核心

浏览器缓存:主要指localStorage,sessionStorage,cookie等等。
主要用于缓存如用户信息、列表数据等;
localStorage,sessionStorage只能保存5M左右的数据
cookie只能保存4kb的数据

http缓存

定义

官方:Web 缓存是可以自动保存文档副本的 HTTP 设备。当 Web 请求抵达缓存时, 如果本地有“已缓存的”副本,就可以从本地存储设备而不是原始服务器中提取这 个文档。

缓存主要是针对html,css,img等静态资源,一般不会去缓存一些动态资源,动态资源数据的实时性,一般都缓存一些不太容易被改变的静态资源。

优点

快速加载页面
减少网络传输
减少服务器负载

缺点

可能会占内存(有些缓存会被存到内存中)

对于SPA应用(单页面应用),页面加载速度上有明显的提升,是提升网站性能与用户体验的有效策略

http缓存类型

  • 强缓存(强制缓存)
  • 协商缓存

强缓存

Expires实现的强缓存

响应头中Expires字段作用:强缓存

某资源设置响应头为:Expires:new Date(“2023-02-08 23:59:59”);
该资源在2023-02-08 23:59:59之前,不会去服务器请求获取资源,优先会去本地的磁盘(或内存)中读取,
Expires已经被废弃了

原因:
Expires判断强缓存是获取本地时间戳,与响应头中的Expires时间(服务器时间)比较,Expires依赖本地时间,如果本地与服务器时间不同步,就会出现资源无法被缓存或者资源永远被缓存的情况。

强缓存功能通常使用cache-control字段来代替Expires字段

Cache-control实现的强缓存

响应头中Cache-control字段作用:强缓存
该字段在http1.1中增加的
解决的问题:完美解决了Expires本地时间和服务器时间不同步的问题
Cache-control资源的响应头上写上缓存时长,单位是秒

//往响应头中写入需要缓存的时间
res.writeHead(200,{'Cache-Control':'max-age=100'});
// 资源第一次返回的时候开始,往后的100秒钟内如果该资源被再次请求,则从缓存中读取。

Cache-Control:max-age=N,N就是需要缓存秒数。从第一次请求资源的时候开始,后N秒内,若再次请求该资源,则直接从磁盘(或内存中读取),不请求服务器。

Cache-control不需要比对客户端和服务端的时间,解决了Expires所存在的漏洞。

Cache-control包含字段max-age、s-maxage、no-cache、no-store、private、public

max-age客户端资源被缓存多久
s-maxage代理服务器缓存的时长
no-cache表示强制进行协商缓存
no-store是表示禁止任何缓存策略
public表示资源可以被浏览器缓存也可以被代理服务器缓存
private表示资源只能被浏览器缓存

直接发送到客服端
在这里插入图片描述发送到客服端京代理服务器在这里插入图片描述
public和private不能同时出现在响应头的cache-control字段中

协商缓存

last-modified实现的协商缓存

响应头中last-modified作用:协商缓存

  1. 首先在服务器端读出文件修改时间
  2. 读出来的修改时间赋给响应头的last-modified字段
  3. 设置Cache-control:no-cache --》跳过强缓存校验,进行协商缓存
  4. 客户端读取到last-modified的时候,会在下次的请求标头中携带一个字段:If-Modified-Since,这个请求头中的If-Modified-Since就是服务器上次给的last-modified值

之后每次对该资源的请求,请求头中都会带上If-Modified-Since这个字段,服务端拿到这个时间并与再次读取该资源的修改时间作比对,来决定是读取缓存还是返回新的资源

使用last-modified方式的协商缓存存在两个非常明显的漏洞。这两个漏洞都是基于文件是通过比较修改时间
1.在文件内容本身不修改的情况下,有可能更新文件修改时间(比如修改文件名再改回来),这样,就有可能文件内容明明没有修改,但是缓存依然失效了;
2.当文件在极短时间内完成修改的时候(比如几百毫秒)。因为文件修改时间记录的最小单位是秒,所以,如果文件在几百毫秒内完成修改的话,文件修改时间不会改变,这样,即使文件内容修改了,依然不会返回新的文件。

为了解决上述问题。http1.1开始新增了一个头信息,ETag(Entity 实体标签)

ETag实现的协商缓存

ETag:比较文件哈希值
文件指纹:根据文件内容计算出的唯一哈希值

流程:

  1. 第一次请求某资源的时候,服务端读取文件计算出文件哈希值,将文件哈希值放在响应头的etag字段中跟资源一起返回给客户端;
  2. 第二次请求某资源的时候,客户端自动从缓存中读取出上一次服务端返回的ETag也就是文件哈希值。并赋给请求头的if-None-Match字段,让上一次的文件哈希值跟随请求一起回到服务端;
  3. 服务端读取请求头中的is-None-Match字段值(上一次的文件指纹),服务器读取目标资源并生成文件哈希值,做对比。如果两个文件指纹完全一样,说明文件没有被改变,直接返回304状态码和一个空的响应体并return。如果两个文件指纹不吻合,则说明文件被更改,那么将新的文件指纹重新存储到响应头的ETag中并返回给客户端

协商缓存的修改时间比对和文件哈希值比对,是一样的

缺点

ETag需要计算文件哈希值的开销。如果文件尺寸大,数量多,计算频繁,ETag的计算就会影响服务器的性能。ETag在这样的场景下不是很适合

ETag有强验证和弱验证
**强验证:ETag生成的哈希码深入到每个字节。**文件中只要有字节改变了,就会生成不同的哈希值,它可以保证文件内容绝对的不变。但是,强验证非常消耗计算量。

**弱验证:弱验证是提取文件的部分属性来生成哈希值。**不会精确到每个字节,整体速度会比强验证快,但准确率不高。会降低协商缓存的有效性

能用cache-control就不要用expiress
ETag并不是last-modified的完全替代方案。而是last-modified的补充方案
到底是用ETag还是last-modified完全取决于业务场景,这两个没有谁更好谁更坏

设置缓存

前端基本不需要做什么,告知后端加响应头字段(上文介绍)

文件缓存(html、js、css、png)

哈希值的文件设置强缓存
没有哈希值的文件(比如index.html)设置协商缓存
在这里插入图片描述

前端打完包之后的css文件、js文件,文件名中包含一串乱码,这串乱码字符串叫哈希值。
每次打包之后都会生产一串新的哈希值并加到我们的文件名中
哈希值是打包后的文件名的一部分

哈希值的文件设置强缓存
没有哈希值的文件(比如index.html)设置协商缓存

第一次打包a1.css文件加哈希值 a1.aaaaa.css,给a1.aaaaa.css设置了强缓存1W年。
再次打包后生产新的哈希值,a1.bbbbb.css文件。当我们第一次访问a1.bbbbb.css文件的时候是不会被缓存。1W年的缓存是给a1.aaaaa.css文件

index.html是不会设置哈希值

哈希值是需要webpack生成的。有些框架会自带(umi.js),设置缓存前务必看下自己的dist文件。如果没有配置的话,你可能所有文件都不带哈希值。

总结

http缓存可以加快响应速度

强缓存,cache-control是Expires的完全替代方案,尽量使用cache-control

协商缓存,etag并不是last-modified的完全替代方案,是补充方案,使用取决于业务场景。

有些缓存是从磁盘读取,有些缓存是从内存读取,从内存读取的缓存更快

响应码带304的资源都是协商缓存,所有标注(从内存中读取/从磁盘中读取)的资源都是强缓存


http://chatgpt.dhexx.cn/article/FpYwXZSs.shtml

相关文章

前端缓存(HTTP缓存、浏览器缓存)浅析

前端缓存 文章目录 前端缓存缓存分类1、http缓存(1)强缓存(本地缓存)启发式缓存 (2)协商缓存(弱缓存) 2、浏览器缓存 其他响应头和请求头参数刷新正常重新加载硬性重新加载清空缓存并硬性重新加载 调试缓存 缓存分类 1、http缓存 …

前端缓存最佳实践

点击上方“前端开发博客”,选择“设为星标” 回复“2”加入前端群 作者:黑金团队https://juejin.cn/post/6844903737538920462 前言 缓存,这是一个老生常谈的话题,也常被作为前端面试的一个知识点。本文,重点在与探讨在…

技术点:前端缓存分类及使用

前端缓存 什么是 web 缓存(前端缓存) web 缓存主要指的是两部分:浏览器缓存和 http 缓存 浏览器缓存:比如,localStorage,sessionStorage,cookie 等等。这些功能主要用于缓存一些必要的数据,比如用户信息。比如需要携…

前端缓存详解

目录 前言 一、按缓存位置分类 HTTP状态码及区别 几种状态的执行顺序 Memory Cache Disk Cache Service Worker 请求网络 二、HTTP 缓存 HTTP 缓存分类 强缓存原理 协商缓存原理 更新和废弃缓存 三、缓存小结 四、缓存的优点 五、浏览器缓存策略 五、缓存的应…

一文!彻底弄懂前端缓存

前端缓存 前端缓存,这是一个老生常谈的话题,也常被作为前端面试的一个知识点。今天我们再来总结一下。 分类 前端缓存分为强缓存和协商缓存两种。 强缓存 强缓存主要使用Expires、Cache-Control 两个头字段,两者同时存在Cache-Control 优先级…

【前端页面缓存技术方案】

前端页面缓存技术方案 关于页面缓存数据的纯前端技术方案背景项目存在的现有方案思考🤔其他技术调研react-activationreact-router-cache-route 结论 关于页面缓存数据的纯前端技术方案 背景 为了优化用户的体验,可能会遇到这样的需求:在列…

前端常用缓存技术

http://www.cnblogs.com/belove8013/p/8134067.html 今天刚上班就听到群里的几位大佬在讨论所开发的系统需要重复的登录的恶心之处,听各位大佬争辩的同时,想到了自己以前整理过的缓存技术,算是比较全面的,当然了只是帮助自己理解的…

我的网站心得之缓存技术(前端篇)

在前端面试中,storage是面试官经常问的问题,我先问你几个问题,如果你回答不上来,那么你应该阅读一下:知道storage吗?storage存储的数据类型有什么?sessionStorage的生命周期?你都用l…

中高级前端工程师都需要熟悉的技能--前端缓存

前言 web缓存是高级前端工程师必修技能。是我们变成大牛过程中绕不开的知识点。 文章会尽量用通俗易懂的言语来细说web缓存的概念和用处。 本期文章的大纲是 什么是web缓存(前端缓存) 缓存可以解决什么问题?他的缺点是什么? …

ovo svm_反思我在OVO担任远程产品设计实习生的时间

ovo svm In a quiet bedroom accompanied only by the low humming of my laptop fan, I sat before a Google Hangouts meeting, and got to know my colleagues for the first time, unaware of the joy of a ride that was waiting for me at OVO Design. 在一个安静的卧室里…

反思最近这些时日的荒废

为什么80%的码农都做不了架构师?>>> 算是一时兴起,最近lol排位已经将自己的折磨的不成人样。闲了这么久,是时候找份工作了。最近一直没敢跟家里人打电话,实在不知道该说些什么,一开口便是谎言。是否自己真的…

团队愿景_周一的愿景,每日的成果,周五的远程团队管理反思

团队愿景 My friend J.D. Meier has an amazing blog called Sources of Insight and hes written a fantastic book called Getting Results the Agile Way. You can buy his book on Amazon (its free on Kindle Unlimited!). I put J.D. up there with David Allen and Step…

WPBeginner年满10岁-反思,更新和WordPress赠品(奖金124,000美元以上)

Wow, it’s the tenth fourth. Today, WPBeginner is officially 10 years old — feels unreal to type this! 哇,是第十位 今天,WPBeginner正式成立了10岁-键入此图标感到不切实际! Like every year, I want to take a few minutes and d…

误泄露公司代码、疫情期间被裁,一个“菜鸟”程序员的生存日记

作者 | Adam Hughes 译者 | Sambodhi 策划 | Tina 编辑|燕珊 “我是如何从每一次失败中成长起来的。” 身为程序员,我们往往都了解大神级程序员的故事。比如很小就开始编程,在 11 岁时就创建了第一家能盈利的网站,16 岁上大学、17…

失败需要反思

2019独角兽企业重金招聘Python工程师标准>>> 公司的第一款游戏是抄袭的COC,然而我加入进去的时候开发已过半,进入之后主要是参与一些新的系统与玩法的开发,在我加入到这个项目之后还开发了大概半年时间,据说此前已经开…

CTF笔记 个人HNCTF反思(部分题目)

文章目录 [WEEK2]easy_include自己的胡思乱想WP [WEEK2]easy_unserexp [WEEK2]easy_sqlWP [WEEK2]ez_SSTIPAYLOAD [WEEK4]pop子和pipi美总结 怎么说呢,这次充分感觉到了自己的无能,可能因为在比赛马上结束的时候加入,让我没心思慢慢思考&…

一名大学毕业生的反思_反思我大学毕业时的软件工程师的第一年

一名大学毕业生的反思 Note: This post is mainly targeted towards students who are about to graduate or have already graduated and are preparing to start their new full-time job. Some of the examples used are specific to my experience as a New Grad Software …

华清远见嵌入式培训_第二周回顾与反思

目录 前言 周一 一、switch..case 1.1 注意事项 1.2 使用练习 二、循环控制语句 2.1 使用goto实现循环 2.2 while循环 2.3 do..while 循环 2.4 for 循环 2.5 死循环 2.6 辅助控制关键字 周二 一、数组 1.1 一维数组 1.2 数组越界问题 1.3 二维数组 1.4 编码练…

让计算机开口说话教学反思,英语教学反思(合集15篇)

英语教学反思(合集15篇) 身为一位优秀的老师,课堂教学是我们的工作之一,借助教学反思我们可以快速提升自己的教学能力,我们该怎么去写教学反思呢?以下是小编为大家收集的英语教学反思,希望能够帮助到大家。 英语教学反…

华清远见嵌入式培训_第五周回顾与反思

前言 这是在华清学习的第五个周末,这一周主要学习的是数据结构。老师说数据结构是一门非常庞大的学科,单单是数据结构里的一个小分支,单拎出来一周都未必可以学透,因此这周的数据结构课程里更多的是思维方向的学习,学习…