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

HTTP 缓存的工作原理

缓存是解决http1.1当中的性能问题主要手段。缓存可能存在于客户端浏览器上,也可以存在服务器上面,当使用过期缓存可能给用户展示的是错误的信息而导致一些bug。

HTTP 缓存:为当前请求复用前请求的响应

目标:减少时延;降低带宽消耗(可能压根没有发出任何请求,所以整个吞吐量下降了)
可选而又必要

缓存其实是在时间维度上面的缓存,第一个请求缓存了,那么为后续的请求就可以使用第一个请求缓存住的响应。

request发出请求到web server发出的响应,其中这个响应当中可以得到一些信息,告诉我们这个响应是可以被缓存的,接下来缓存到本地的浏览器的缓存当中。

后面想要再次发起请求的时候,会先去判断浏览器当中的缓存是否过期了,因为在响应当中明确的指出js css只能存在几天,几个小时,之后就必须到服务器获取,如果没有过期,那么就直接使用本地的缓存。

 jss css文件都是使用的缓存。因为可以从size这里看到memory cache表示从缓存当中读出来的,也就是这个文件压根没有向服务器端发送(所以这些请求压根不会发送,也就是压根没有网络请求,没有网络带宽,这样用户体验也会好一些)。

如果缓存过期,则继续从服务器验证

首先去看到缓存是过期了,但是缓存得有一个标签,这个标签告诉服务器再返回304你可以继续使用,那么直接可以和用户来展示。

百度首页告诉我们过期时间还是挺久的,可以从max-age和expire这里看到过期时间还是很久的,浏览器要想认为它过期是比较难的。

curl 'http://ss.bdimg.com/static/superman/css/recommand/init-c52228535a.css' \
  -H 'Referer: http://www1.baidu.com/' \
  -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36' \
  --compressed

 如果浏览器中有缓存,但是过期了会怎么样?那么浏览器会添加一些相应的头部

curl 'http://ss.bdimg.com/static/superman/css/recommand/init-c52228535a.css' \
  -H 'Referer: http://www1.baidu.com/' \
  -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36' \
  --compressed -H 'if-None-Match: "6387f366-2a20"' -I

etag就是响应的一个指纹,这个时候服务器就知道缓存了一个响应,服务器端会保存这个指纹,比较是Ok的,它就会返回304,好处就是content-length为0,这样就节约了大量的带宽。

这个时候浏览器客户端就知道了,直接使用缓存中的过期响应就行了。

 

私有缓存与共享缓存

  • 私有缓存:仅供一个用户使用的缓存,通常只存在于如浏览器这样的客户端上
比如浏览器,那么只能提供给一个用户使用。
  • 共享缓存:可以供多个用户的缓存,存在于网络中负责转发消息的代理服务器(对热点资源常使用共享缓存,以减轻源服务器的压力,并提升网络效率)
共享缓存都是放在服务器上面的,他可以供很多用户共同使用,比如热点视频,js这样的资源
,正向代理和反向代理都可以使用到缓存。
          • Authentication 响应不可被代理服务器缓存(验证类型的响应是不能被代理服务器缓存的)
          • 正向代理
          • 反向代理

相关文章:

  • STM32开发(九)STM32F103 通信 —— I2C通信编程详解
  • Leetcode 6322. 检查骑士巡视方案 暴力模拟法 第337场周赛,第二题
  • 蚂蚁一面面试经历
  • Spring事务和事务传播机制
  • ChatGPT加强版GPT-4面世,打工人的方式将被颠覆
  • oracle和mysql的区别
  • 指针进阶(上)
  • C++ 手撸简易服务器(完善版本)
  • string类(上)
  • SpringCloud五大核心组件
  • IntelliJIDEA 常用快捷键
  • 【2024考研】计算机考研,4轮复习时间安排
  • js类型转换
  • 一天吃透TCP面试八股文
  • 美团笔试-3.18
  • [NodeJS] 关于Buffer
  • [译]CSS 居中(Center)方法大合集
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • 2017届校招提前批面试回顾
  • ECS应用管理最佳实践
  • gf框架之分页模块(五) - 自定义分页
  • github从入门到放弃(1)
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • Java知识点总结(JavaIO-打印流)
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • SAP云平台里Global Account和Sub Account的关系
  • Shadow DOM 内部构造及如何构建独立组件
  • spring学习第二天
  • 机器学习 vs. 深度学习
  • 前端临床手札——文件上传
  • 前端性能优化--懒加载和预加载
  • 深入 Nginx 之配置篇
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 以太坊客户端Geth命令参数详解
  • kubernetes资源对象--ingress
  • ​ubuntu下安装kvm虚拟机
  • ​渐进式Web应用PWA的未来
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)fock函数详解
  • (转)视频码率,帧率和分辨率的联系与区别
  • (转载)虚函数剖析
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET Core 中的路径问题
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .Net7 环境安装配置
  • .net与java建立WebService再互相调用
  • [Android]创建TabBar