当前位置: 首页 > news >正文

HTTP面试题——缓存技术

目录

HTTP缓存技术有哪些?

什么是强制缓存?

什么是协商缓存?


HTTP缓存技术有哪些?

对于一些具有重复性的HTTP请求,比如每次请求得到的数据都是一样的,我们可以把这对 请求-响应的数据都缓存在本地,那么下次就直接读取本地数据,不必通过网络获取服务器响应的数据了,这样对于http1.1的性能是明显的提升。

对于http缓存有两种实现方式,分别是强制缓存协商缓存

什么是强制缓存?

强制缓存:指的是只要浏览器判断缓存没有过期,直接使用浏览器的缓存,决定是否使用缓存的主动性在浏览器这边

强缓存是利用下面这两个http响应头部(Response Header)字段实现的,都用来表示资源在客户端的有效期:

Cache-Control,是一个相对时间;

Expires,是一个绝对时间;

Cache-Control和Expires字段同时存在的化,Cache-Control的优先级更高于Expires。

Cache-Control实现强制缓存。具体流程如下:

  1. 当浏览器第一次请求访问服务器资源时,服务器会在这返回这个资源的同时,在Response头部加上Cache-control,Cache-Control中这是了过期时间大小;
  2. 浏览器再次请求访问服务器中的该资源时,会想通过请求资源的时间与Cache-Control中的过期时间大小,来计算该资源是否过期,如果没有,则使用该缓存,否则重新请求服务器;
  3. 服务器再次收到请求后,会再次更新Response头部的Cache-Control。

什么是协商缓存?

当我们在浏览器使用开发者工具的时候,你可能会看到过某些请求的响应码是304,这个是告诉浏览器可以使用本地缓存的资源,通常这种通过服务端告知客户端可以使用缓存的方式被称为协商缓存。

协商缓存可以基于两种头部来实现。

第一种:请求头部中的If-Modified-since字段与响应头部中的Last-Modified字段实现,这两个字段的意思是:

  • 响应头部中的Last-Modified:表示这个响应资源的最后修改时间;
  • 请求头部中的If-Modified-Since:当资源过期了,发现响应头中具有Last-Modified声明,则再次发起请求的时候带上Last-Modified的时间,服务器收到请求后发现有If-Modified-Since则与被请求资源的最后修改时间进行对比(Last-Modified),如果最后修改时间比较新,说明资源又被修改过,则返回最新资源,HTTP 200 OK;如果最后修改时间比较旧,说明资源无新修改,响应HTTP 304走缓存。

第二种:头部中的if-None-Match字段与响应头部中的ETag字段,这两个字段的意思是:

  • 响应头部中Etag:唯一标识响应资源;
  • 请求头部中的If-None-match:当资源过期时,浏览器发现响应头里有Etag,则再次向服务器发起请求时,会将请求头If-None-Match值设置为Etag的值。服务器收到请求后进行比对,如果资源没有变化返回304,如果资源变化了返回200。

第一种实现方式是基于时间实现的,第二种实现方式是基于一个唯一标识实现的,相对来说后者可以更加准确的判断文件内容是否被修改,避免由于时间篡改导致的不可靠问题。

如果在第一次请求资源的时候,服务端返回的HTTP响应头部同时有Etag和last-Modified字段,那么客户端在下一次请i去的时候如果带上了Etag和Last-Modified字段信息给服务端,这时Etag的优先级更高,也就是服务端会先判断Etag是否变化了,如果Etag有变化就不用在判断Last-Modified,如果Etag没有变化,然后再看last-Modified。

Etag优先级高于Last-Modified的原因:

因为在没有修改文件内容情况下的最后修改时间也可能发生改变,这导致客户端认为文件被改动了从新发起请求;

有些文件修改在毫秒级内,if-since-Since能检查到的粒度是秒级的,

而且协商缓存这两个字段都需要配合强制缓存中的Cache-Control字段来使用,只有在未能命中强制缓存的时候,才能发起带有协商缓存字段的请求。

http://www.lryc.cn/news/574487.html

相关文章:

  • Qt面试题汇总
  • 记录一下小程序城市索引栏开发经历
  • ✨从零搭建 Ubuntu22.04 + Python3.11 + PyTorch2.5.1 GPU Docker 镜像并上传 Docker Hub
  • Rocky8使用gvm配置Go多版本管理的微服务开发环境
  • uni-app项目实战笔记24--uniapp实现图片保存到手机相册
  • spring01-简介
  • 618风控战升级,瑞数信息“动态安全+AI”利剑出鞘
  • window显示驱动开发—DirectX 图形基础结构 DDI
  • 【CS创世SD NAND征文】基于全志V3S与CS创世SD NAND的物联网智能路灯网关数据存储方案
  • taro小程序,tailwindcss的bg-x-x,背景颜色不生效,只有自定义的写法颜色才生效
  • C++修炼:异常
  • 解码成都芯谷金融中心文化科技产业园:文化+科技双轮驱动
  • Qt 中使用 gtest 做单元测试
  • 一文读懂微观测量:光学3D轮廓仪与共聚焦显微成像的结合应用
  • cherry-pick除了使用命令,有没有什么工具可以使用,或者更高效的方法
  • Linux 文件 I/O 与标准 I/O 缓冲机制详解
  • Java面试中被深挖过的线程问题
  • 对手机屏中断路和短路的单元进行切割或熔接,实现液晶线路激光修复原理
  • Luckysheet Excel xlsx 导入导出互相转换
  • 02-Linux内核源码编译
  • CentOS 7 编译安装Nginx 1.27.5完整指南及负载均衡配置
  • MinIO中视频转换为HLS协议并进行AES加密
  • Python Polars库详解:高性能数据处理的新标杆
  • pyqt多界面
  • LangChain网页自动化PlayWrightBrowserToolkit
  • gRPC 静态库链接到 DLL 的风险与潜在问题
  • 鸿蒙开发深入解析:Service Ability(后台任务)全面指南
  • 深度解析|智能汽车操作系统技术突破:从架构演进到产业重构
  • 比翼双飞,影像的迁徙之旅
  • 基于目标驱动的分布式敏捷开发