浅谈Web缓存

news/2025/2/13 0:53:16/

Web缓存分为两类

  • http缓存
  • 浏览器缓存

1、缓存位置

  • Service Worker
  • Memory Cache
  • Disk Cache
  • Push Cache

2、浏览器缓存分为三类

  • cookie
  • localStrorage
  • sessionStorage
    cookie的最大容量为4kb, localStorage, sessionStorage容量为5M
    localStorage可永久存储, 除非调用API删除或手动删除
    sessionStorage关闭浏览器即可清除

3、http缓存分为两类

  • 强制缓存: 不经过服务器,直接从缓存中读取数据
  • 协商缓存: 向服务器发送请求,由服务器决定是从缓存中读取数据,还是由服务器返回新的数据

3.1 浏览器请求过程

我用浏览器搜索一个问题,浏览器首先就会向本地缓存发送一个HTTP请求,由于我是第一次请求此数据,缓存中必然是没有记录的,没有命中缓存,接着浏览器向服务器发送HTTP请求,服务器发出响应,响应头中包含缓存标识,浏览器将请求结果存入浏览器缓存中,并进行数据解析与页面渲染。

3.2 强缓存

3.2.1 与强缓存有关的响应头:
expires: 缓存资源到期的时间, 这个时间之前就是取的缓存数据
缺点: 本机时间可被修改, 不准确
catch-control: 规定缓存资源的有效时间, 例如max-age=2592000
若过期的话, 就走协商缓存
在这里插入图片描述

3.3协商缓存

3.3.1 与协商缓存有关的响应头与请求头
在这里插入图片描述

3.3.1.1 响应头:Last-Modified 请求头:If-Modified-Since
Last-Modified:资源的最后修改时间
服务器在响应时,会有一个Last-Modified的响应头,浏览器下次请求时,If-Modified-Since的值就会设为服务器上次响应的Last-Modified的值,请求到达服务器时,服务器就会根据这个值与服务器端资源更新时间进行比对,如果自上一次响应后资源未更新,则返回状态码304,表示资源未更新,可以直接从缓存中取数据,浏览器收到304后,就去缓存中取数据。如果比对后发现自上次响应后,服务器资源有更新,则返回200状态码,重新从服务器中响应数据和缓存标识等,存入浏览器缓存。

缺点:Last-Modified的值精确到秒,若在秒内发生资源更新,则可能导致浏览器依旧从缓存中读取数据。
在这里插入图片描述

3.3.1.2 响应头:ETag 请求头:If-None-Match
ETag:若服务器资源更新,则ETag也会更新
在这里插入图片描述

流程与Last-Modified/If-Modified-Since一致,解决了秒内发生资源更新,无法识别的问题

3.3.2 两者比较
优先使用 Etag。
Last-Modified 只能精确到秒级。
如果资源被重复生成,而内容不变,则 Etag 更精确。

4 三种刷新操作对 http 缓存的影响

正常操作:地址栏输入 url,跳转链接,前进后退等。
手动刷新:f5,点击刷新按钮,右键菜单刷新。
强制刷新:ctrl + f5,shift+command+r。

正常操作:强制缓存有效,协商缓存有效。
手动刷新:强制缓存失效,协商缓存有效。
强制刷新:强制缓存失效,协商缓存失效。

5 总结

在这里插入图片描述

浏览器每次请求时,首先判断是否有缓存,若无缓存则向服务器发送请求,并将响应结果存至缓存。

若有缓存,第一选择都是走强缓存——直接访问浏览器缓存,若缓存数据有效(评判指标:有效时间,依据:Expires或Cache-Control)则直接从缓存返回数据;若缓存数据无效,则走协商缓存(解决服务器端有资源更新的问题)。

协商缓存的要点就是判断资源有无更新(依据:Last-Modified/If-Modified-Since,ETag/If-None-Match)。若无更新(304),依旧从缓存中返回数据,若有更新(200),则从服务器返回数据,并更新缓存。

参考资料
http 缓存
浏览器缓存——强缓存与协商缓存


http://www.ppmy.cn/news/9480.html

相关文章

Qt——项目:翻转金币游戏

目录 一.示例演示 二.制作思路 (一).准备资源及总体框架 (二).开始窗口 (三).选择关卡窗口 (四).游戏窗口 (五).优化 三.实现代码 (一&a…

Vue2 和 Vue3的区别

Vue 2 组件化、响应式、内置虚拟dom、用在浏览器开发,并且有一个运行时把这些模块很好的管理起来的架构Vue2 的响应式并不是真正意义的代理,而是基于Object.defineProperty实现的。删除数据无法监听,需要$delete等Api辅助监听Option API 在组…

Linux 文本处理三剑客应用

Linux 系统中文本处理有多种不同的方式,系统为我们提供了三个实用命令,来实现对行列的依次处理功能,grep命令文本过滤工具,cut列提取工具,sed文本编辑工具,以及awk文本报告生成工具,利用这三个工…

中国工业以太网交换机市场分析

一、我国以太网交换机市场: 工业以太网交换机(IndustrialEthernetSwitches)是能够满足工业现场需要,技术层面与商业以太网交换机适配,而实时通信、可靠性、稳定性、安全性、环境适应性等各个方面规定高于商业以太网交…

曾经对程序员最好的公司,倒下了

硅谷有一家公司,它发明了同时代最好的CPU,最好的操作系统,最好的编程语言,但是由于傲慢和目光短浅,在短短二十多年间就走到了尽头。它就是Sun Microsystems,硅谷最让人惋惜的公司。1Sun的出现是个巧合。80年…

C#语言实例源码系列-游戏-实现俄罗斯方块

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 👉关于作者 众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中…

responseType几种类型

响应responseType xhr.response的数据类型 responseType值 xhr.response 数据类型 说明 responseType值xhr.response 数据类型说明" "String字符串默认值(在不设置responseType时)textString字符串–documentDocument对象希望返回 XML 格式数据时使用jsonjavascript…

JAVA mongodb 聚合查询

区分先后条件顺序,这是个坑! /*** 测试聚合*/Testpublic void testAggregation() {String format_DateTime "yyyy-MM-dd HH:mm:ss";DateTimeFormatter df DateTimeFormatter.ofPattern(format_DateTime);LocalDateTime localDateTime Local…