JavaScript-缓存

news2025/7/20 21:20:58

参考资料


  • 彻底解决让用户清一下浏览器缓存

  • 浏览器缓存

  • 彻底理解浏览器的缓存机制

  • 彻底弄懂前端缓存

  • 浅解强缓存和协商缓存

  • 浏览器缓存策略(强缓存和协商缓存)

  • 一文搞定Http缓存-强制缓存与协商缓存

  • 前端浏览器缓存知识梳理

  • ASP.NET Core 中使用缓存

  • IIS中设置Cache-Control

是什么


当我们第一次访问网站的时候,比如 baidu.com ,电脑会把网站上的图片和数据下载到电脑上,当我们再次访问该网站的时候,网站就会从电脑中直接加载出来,这就是缓存。
  • 优点:

  • 减少了冗余的数据传输,节省网费;

  • 提升性能,加快了客户端加载网页的速度;

  • 减少服务器的负担,提升网站性能;

  • 缺点:

  • 如果处理不当,可能会导致服务端代码更新了,但是用户却还是老页面;

  • 消耗内存或者存储;

Web缓存种类: 数据库缓存,CDN缓存,代理服务器缓存,浏览器缓存。

  • 浏览器缓存:浏览器将用户请求过的静态资源(html、css、js),存储到电脑本地,当浏览器再次访问时,就可以直接从本地加载了,不需要再去服务端请求了。
    浏览器缓存 是由服务端设置的!!!

缓存命中显示


从服务器获取新的资源

命中强缓存,且资源没过期,直接读取本地缓存

命中协商缓存,且资源未更改,读取本地缓存

注意:协商缓存无论如何,都要向服务端发请求的,只不过,资源未更改时,返回的只是header信息,所以size很小;而资源有更改时,还要返回body数据,所以size会大。

缓存流程


缓存规则


强缓存

简单粗暴,如果资源没过期,就取缓存,如果过期了,则请求服务器。
  • 主要是看Response Headers中的 Cache-Control ,图中的max-age = 25xxx,就是说在这些秒内,都直接使用缓存,超过了就继续请求服务器。

  • Expires:Expires是HTTP/1.0的字段,和 Cache-Control 并列的,现在现在浏览器默认使用的是HTTP/1.1,所以不用管。

  • Cache-Control 服务端参数:

  • private:仅浏览器可以缓存,Cache-Control的默认取值

  • public:浏览器和代理服务器都可以缓存(对于private和public,前端可以认为一样,不用深究)

  • max-age=xxx:过期时间(重要)

  • s-maxage: 就是用于表示 cache 服务器上(比如 cache CDN,缓存代理服务器)的缓存的有效时间的,并只对 public 缓存有效。

  • no-cache:不进行强缓存(重要)

  • no-store:不强缓存,也不协商缓存
    注意:规则可以同时多个

  • Cache-Control 客户端参数:

  • max-stale: 5 表示客户端到代理服务器上拿缓存的时候,即使代理缓存过期了也不要紧,只要过期时间在 5 秒之内,还是可以从代理中获取的。

  • min-fresh: 5 表示代理缓存需要一定的新鲜度,不要等到缓存刚好到期再拿,一定要在到期前 5 秒之前的时间拿,否则拿不到。

  • only-if-cached 这个字段加上后表示客户端只会接受代理缓存,而不会接受源服务器的响应。如果代理缓存无效,则直接返回 504(Gateway Timeout)。

  • 强缓存流程:

协商缓存

协商缓存就是强缓存失效后,浏览器携带缓存标识向服务器发送请求,由服务器根据缓存标识来决定是否使用缓存的过程。
  • 触发条件:

  • Cache-Control 的值为 no-cache (不强缓存)

  • 或者 max-age 过期了 (强缓存,但过期了)

  • 协商缓存的相关规则:

  • ETag:每个文件有一个,改动文件了就变了,可以看似md5

  • Last-Modified:文件的修改时间

  • 协商缓存过程:每次http返回来Response Headers 中的 ETag和 Last-Modified,在下次请求时在Request Headers就把这两个带上(但是名字变了ETag–>If-None-Match,Last-Modified–>If-Modified-Since ),服务端把你带过来的标识,资源目前的标识,进行对比,然后判断资源是否更改了。

  • 第1次请求:

  • 第n次请求:

  • 协商缓存流程:

  • 请求资源时,把用户本地该资源的 ETag 同时带到服务端,服务端和最新资源做对比。

  • 如果资源没更改,返回304,浏览器读取本地缓存。

  • 如果资源有更改,返回200,返回最新的资源。

  • 为什么要有Etag
    你可能会觉得使用Last-Modified已经足以让浏览器知道本地的缓存副本是否足够新,为什么还需要Etag呢?HTTP1.1中Etag的出现(也就是说,ETag是新增的,为了解决之前只有If-Modified的缺点)主要是为了解决几个Last-Modified比较难解决的问题:

  • 一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时候我们并不希望客户端认为这个文件被修改了,而重新GET;

  • 某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),If-Modified-Since能检查到的粒度是s级的,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒);

  • 某些服务器不能精确的得到文件的最后修改时间。

强缓存与协商缓存的区别

缓存存储位置


按缓存位置分类我们可以分为memory cache、disk cache、Service Worker三类,我们可以在 Chrome 的开发者工具中,Network -> Size 一列看到一个请求最终的处理方式:如果是大小 (多少 K, 多少 M 等) 就表示是网络请求,否则会列出 from memory cache、from disk cache、from ServiceWorker就表示命中了缓存。

查找浏览器缓存时会按顺序查找: Service Worker–>Memory Cache–>Disk Cache–>Push Cache。

  • Service Worker:是运行在浏览器背后的独立线程,一般可以用来实现缓存功能。使用 Service Worker的话,传输协议必须为 HTTPS。因为 Service Worker 中涉及到请求拦截,所以必须使用 HTTPS 协议来保障安全。Service Worker 的缓存与浏览器其他内建的缓存机制不同,它可以让我们自由控制缓存哪些文件、如何匹配缓存、如何读取缓存,并且缓存是持续性的。

  • Memory Cache:内存中的缓存,主要包含的是当前中页面中已经抓取到的资源,例如页面上已经下载的样式、脚本、图片等。读取内存中的数据肯定比磁盘快,内存缓存虽然读取高效,可是缓存持续性很短,会随着进程的释放而释放。一旦我们关闭 Tab 页面,内存中的缓存也就被释放了。

  • Disk Cache:存储在硬盘中的缓存,读取速度慢点,但是什么都能存储到磁盘中,比之 Memory Cache 胜在容量和存储时效性上。

  • Push Cache:Push Cache(推送缓存)是 HTTP/2 中的内容,当以上三种缓存都没有命中时,它才会被使用。它只在会话(Session)中存在,一旦会话结束就被释放,并且缓存时间也很短暂,在Chrome浏览器中只有5分钟左右,同时它也并非严格执行HTTP头中的缓存指令。

缓存配置


  • nginx:

add_header Cache-Control "no-cache";
location / {

# 其它配置
...

if ($request_uri ~* .*[.](js|css|map|jpg|png|svg|ico)$) {
  #非html缓存1个月
  add_header Cache-Control "public, max-age=2592000";
}

if ($request_filename ~* ^.*[.](html|htm)$) {
  #html文件使用协商缓存
  add_header Cache-Control "no-cache";
}
}

vue 项目:

脚手架已经将更改的文件做 hash 处理了,因此一般的 js、css 文件不需要我们再去操作。

而对于 index.html,我们需要在 nginx 上做 no-cache 处理,即完全不缓存 index.html,每次都请求最新的html,因为 html 中会外链 css、js,如果 html 还是走的缓存,那链接的还是老的 css。

IIS:

<configuration><system.webServer><staticContent><clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="300.00:00:00" /></staticContent><caching><profiles><add extension=".css" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="30:00:30" /><add extension=".js" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="30:00:30" /></profiles></caching></system.webServer></configuration>

java:

  • .net core:
    ResponseCache可以放到方法上,也可以标注到 Class 上。

[HttpGet]
[ResponseCache(Duration = 10)]
public DateTime GetNow()
{
  return DateTime.Now;
}

用户行为对缓存的影响


缓存失效方案


  • 手动修改:
    老方案通过人工自己修改文件名或者在文件名后带上版本号、时间戳,这样客户端就会当新文件请求并使用,之前的强缓存就算在有效期内也会失效。

  • 自动构建:hash值来给文件命名
    在现在的构建阶段基本上都不需要人工操作了,都是使用构建工具比如Wbpack、Gulp、Grunt等构建工具自动构建。比如在使用Webpack构建的时候,会根据文件名或文件内容自动计算hash值来给文件命名,当内容或文件名发生改变的时候,构建出来的文件名也一定会不一样,这样也解决了强缓存还在有效期内的问题。

  • 清除客户端全部缓存:Ctrl+Shift+Delete

  • 单独清除某个缓存,如下图:

  • 设置不缓存

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

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

相关文章

[Gin]框架底层实现理解(一)

前言&#xff1a;路由原理———压缩字典 这边简单讲一下gin非常重要的一个基点&#xff0c;也就是他作为go web框架的一个亮点 也就是Trie树和压缩字典算法 gin 通过树来存储路由&#xff0c;讲路由的字符拆解为一个个的结点&#xff0c;在获取handler函数时&#xff0c;会…

项目管理系统软件有哪些?这10款最好用的项目管理软件值得推荐

项目管理系统软件有哪些&#xff1f;这10款好用的项目管理系统软件值得推荐 如今企业规模不断扩大&#xff0c;业务逐渐复杂化&#xff0c;项目管理系统已经成为现代企业管理中不可或缺的一环&#xff1b; 而项目管理系统软件不仅可以保证项目按时完成&#xff0c;提高团队的…

【Java基础 下】 029 -- 多线程

目录 一、为什么要有多线程&#xff1f; 1、线程与进程 2、多线程的应用场景 3、小结 二、多线程中的两个概念&#xff08;并发和并行&#xff09; 1、并发 2、并行 3、小结 三、多线程的三种实现方式 1、继承Thread类的方式进行实现 2、实现Runnable接口的方式进行实现 3、利用…

MySQL简述

一、什么是数据库 数据库&#xff08;DB&#xff0c;DataBase&#xff09; 概念&#xff1a;数据仓库&#xff0c;相当于一款软件&#xff0c;安装在操作系统&#xff08;Windows&#xff0c;Linux&#xff0c;mac&#xff0c;…&#xff09;之上&#xff0c;可以存储大量的数…

nvm安装及使用(win)

一、安装nvm 下载地址&#xff1a;下载之后安装包安装 安装路径不要有中文或者空格 安装时尽量不要选择系统盘&#xff08;安装在系统盘可能会涉及到权限问题&#xff09; 安装前一定要把 node 的环境变量和 npm 的环境变量删除&#xff0c;否则在切换 node 版本时会报错 二、…

SCL_PFENET跑通填坑

1.数据准备&#xff1a;VOC2012数据集&#xff0c;initmodel文件夹&#xff08;预训练模型&#xff09;&#xff0c;SegmentationClassAug数据2.训练部分&#xff1a;训练部分没什么需要改动的&#xff0c;也就改一下选择的配置文件。在config文件夹里有关于coco和voc数据的配置…

备战蓝桥杯Day3python——迭代器的使用

python封装的迭代器 我们接下来介绍用于返回笛卡尔积的Permutations函数 Permutations(iterator, r) r:表示进行迭代后返回的长度 实例&#xff1a; >>> from itertools import permutations >>> a abc >>> for i in permutations(a,3):print …

Java深拷贝,浅拷贝

一、浅拷贝&#xff1a; &#xff08;1&#xff09; 对于数据类型是基本数据类型的成员变量&#xff0c;浅拷贝会直接进行值传递&#xff0c;也就是将该属性复制一份给新的对象。因为是两份不同的数据&#xff0c;所以对其中一的对象的成员变量值进行修改&#xff0c;不会影响另…

大考在即 百度版ChatGPT会翻车吗?

文心一言的发布会定档3月16日&#xff0c;不出意外&#xff0c;百度创始人李彦宏、CTO王海峰将出现在北京总部的发布会现场。这是百度版ChatGPT最新的官方消息&#xff0c;2月7日&#xff0c;文心一言首次官宣&#xff0c;当时称&#xff0c;产品“3月见”。 3月如期而至&…

C语言再学习 -- __attribute__详解

一、attribute 介绍 __attribute__是一个编译属性&#xff0c;用于向编译器描述特殊的标识、错误检查或高级优化。它是GNU C特色之一&#xff0c;系统中有许多地方使用到。__attribute__可以设置函数属性&#xff08;Function Attribute&#xff09;、变量属性&#xff08;Var…

JavaScript 如何优雅地获取多层级response中的某个深层次字段 ?. 可选链条(Optional chaining)

文章目录一句话场景&#xff1a;从一个多层级对象中拿一个处在深层次位置的字段MDN 可选链搜索引擎使用一句话 var marriedFlag response.data.userList[0].married; // 如果中间某个对象为空&#xff0c;会报Errorvar marriedFlag response?.data?.userList[0]?.married…

外贸新手找客户的开发信修炼之旅(一)

开发信是一种传统的开发海外客户的方式&#xff0c;相信即便是外贸新手也或多或少有所耳闻&#xff0c;甚至已经通过邮件开发到了一些有意向的客户&#xff0c;但有时也会遇到开发信效果不好的情况&#xff0c;收到的回复寥寥无几。其实说白了开发信的本质与派发传单相同&#…

李开复已经对美图公司失去耐心,并在美图公司身上损失惨重

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经经过对美图公司&#xff08;01357&#xff09;的投资人回报、产品、业务结构、战略、财务业绩、估值等方面进行了研究&#xff0c;认为美图这家公司不行&#xff0c;非常不看好&#xff0c;以下是理由供你参考。一…

10 Seata配置Nacos注册中心和配置中心

Seata配置Nacos注册中心和配置中心 Seata支持注册服务到Nacos&#xff0c;以及支持Seata所有配置放到Nacos配置中心&#xff0c;在Nacos中统一维护&#xff1b; 高可用(集群)模式下就需要配合Nacos来完成: 具体配置如下 注册中心 Seata-server端配置注册中心&#xff0c;…

【洛谷 P1219】[USACO1.5]八皇后 Checker Challenge 题解(深度优先搜索+回溯法)

[USACO1.5]八皇后 Checker Challenge 题目描述 一个如下的 666 \times 666 的跳棋棋盘&#xff0c;有六个棋子被放置在棋盘上&#xff0c;使得每行、每列有且只有一个&#xff0c;每条对角线&#xff08;包括两条主对角线的所有平行线&#xff09;上至多有一个棋子。 上面的布…

13_MySQL中的约束

目录 1. 约束(constraint)概述 1.1 为什么需要约束 1.2 什么是约束 1.3 约束的分类 2. 非空约束 2.1 作用 2.2 关键字 2.3 特点 2.4 添加非空约束 2.5 删除非空约束 3. 唯一性约束 3.1作用 3.2 关键字 3.3 特点 3.5 关于复合唯一约束 4. 主键(PRIMARY KEY)约束 4.1 作用 4.2 关…

【Django】Hello,DJango!

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

如何实现报表可视化,有没有工具推荐

随着数据量的不断增长&#xff0c;如何更好地进行数据分析和可视化已成为企业和组织面临的重要挑战。实现报表可视化是一个很好的解决方案&#xff0c;它可以帮助用户更好地理解和分析数据&#xff0c;发现趋势和模式&#xff0c;并支持数据驱动的决策。本文将介绍如何实现报表…

现代卷积神经网络(NiN),并使用NIN训练CIFAR10的分类

专栏&#xff1a;神经网络复现目录 本章介绍的是现代神经网络的结构和复现&#xff0c;包括深度卷积神经网络&#xff08;AlexNet&#xff09;&#xff0c;VGG&#xff0c;NiN&#xff0c;GoogleNet&#xff0c;残差网络&#xff08;ResNet&#xff09;&#xff0c;稠密连接网络…

【3.7】Redis数据类型、CPU缓存一致性、哈希表

文章目录数据类型篇StringListHashSetZsetBitMapHyperLogLogGEOStreamCPU 缓存一致性CPU是如何执行任务的&#xff1f;什么是软中断&#xff1f;为什么0.1 0.2不等于0.3&#xff1f;哈希表数据类型篇 String String 是最基本的 key-value 结构&#xff0c;key 是唯一标识&…