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

article/2025/3/15 11:14:07

前端缓存

什么是 web 缓存(前端缓存)

web 缓存主要指的是两部分:浏览器缓存http 缓存

浏览器缓存:比如,localStorage,sessionStorage,cookie 等等。这些功能主要用于缓存一些必要的数据,比如用户信息。比如需要携带到后端的参数。亦或者是一些列表数据等等。比较基础,不做过多赘述。

http 缓存

缓存可以解决什么问题?他的缺点是什么?

先说说,缓存可以解决什么问题。

  • 减少不必要的网络传输,节约宽带(就是省钱)
  • 更快的加载页面(就是加速)
  • 减少服务器负载,避免服务器过载的情况出现。(就是减载)

再说说缺点

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

http 缓存分为强制缓存与协商缓存

强制缓存

强制缓存,我们简称强缓存。

从强制缓存的角度触发,如果浏览器判断请求的目标资源有效命中强缓存,如果命中,则可以直接从内存中读取目标资源,无需与服务器做任何通讯

基于 Expires 字段实现的强缓存

过时了,有缺陷,略

基于 Cache-control 实现的强缓存(代替 Expires 的强缓存实现方法)

Cache-control 这个字段在 http1.1 中被增加,Cache-control 完美解决了 Expires本地时间和服务器时间不同步的问题。是当下的项目中实现强缓存的最常规方法。

用法

//往响应头中写入需要缓存的时间
res.writeHead(200, {'Cache-Control': 'max-age=10',
})

image.png

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

Cache-control 有 max-age、s-maxage、no-cache、no-store、private、public 这六个属性。

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

no_cacheCache-control 的一个属性。它并不像字面意思一样禁止缓存,实际上,no-cache 的意思是强制进行协商缓存。如果某一资源的 Cache-control 中设置了 no-cache,那么该资源会直接跳过强缓存的校验,直接去服务器进行协商缓存。而 no-store 就是禁止所有的缓存策略了。

作者:工边页字
链接:https://juejin.cn/post/7127194919235485733
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

注意,no-cache 和 no-store 是一组互斥属性,这两个属性不能同时出现在 Cache-Control 中。

在一般的项目架构中 max-age 就够用。
而 s-maxage 因为是代理服务端的缓存时长,他必须和上面说的 public 属性一起使用(public 属性表示资源可以在代理服务器中缓存)。

Cache-control 如何设置多个值:

;`Cache-control:max-age=10000,s-maxage=200000,public`

协商缓存

协商缓存分两种:last-modified 和 ETag

基于 last-modified 的协商缓存

  1. 首先需要在服务器端读出文件修改时间,
  2. 将读出来的修改时间赋给响应头的 last-modified 字段。
  3. 最后设置 Cache-control:no-cache

当客户端读取到 last-modified 的时候,会在下次的请求标头中携带一个字段:If-Modified-Since。

那么之后每次对该资源的请求,都会带上 If-Modified-Since 这个字段,而务端就需要拿到这个时间并再次读取该资源的修改时间,让他们两个做一个比对来决定是读取缓存还是返回新的资源

基础 ETag 的协商缓存

ETag 就是将原先协商缓存的比较时间戳的形式修改成了比较文件指纹。

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

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

相关文章

前端缓存详解

目录 前言 一、按缓存位置分类 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篇) 身为一位优秀的老师,课堂教学是我们的工作之一,借助教学反思我们可以快速提升自己的教学能力,我们该怎么去写教学反思呢?以下是小编为大家收集的英语教学反思,希望能够帮助到大家。 英语教学反…

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

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

利用Python识别txt文本并根据其内容进行文件分类

事情是这样的,有一个图片数据集需要根据分成很多类以便于给其设置标签,但所有的图片都在一个文件里,另外又给了个.txt文件,其中每行都是对应图片的类别。例如第1行对应的第0001.jpg是第14类(每个类都有多张图片&#x…

C# 批量修改文件名称

目的 对文件夹中所有文件名实现批量修改(添加新字符) 思路 获取文件夹路径获取文件夹中所有文件的文件名对文件名进行批量修改 方法 窗口设计 获取文件夹路径 使用FolderBrowserDialog控件获取文件夹路径,并用Directory.Exists方法对路径…

Unity Shader入门精要之Unity 提供的内置文件和变量

Unity系列文章目录 文章目录 Unity系列文章目录前言5.3.1 内置的包含文件5.3.2 内置的变量 二、Unity 提供的Cg/HLSL 语义5.5 程序员的烦恼:Debug5.6 小心:渲染平台的差异5.7 Shader 整洁之道参考 前言 上一节讲述了如何在Unity 中编写一个基本的顶点/片…