热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

摸鱼前端的自检(五)深入HTTP缓存机制及原理

深入HTTP缓存机制及原理身为一个web开发者,必要的http缓存机制还是要去深入了解,因为在这上面可以做很多的web性能优化。要想成为一个好的架构师

深入HTTP缓存机制及原理

身为一个web开发者,必要的http缓存机制还是要去深入了解,因为在这上面可以做很多的web性能优化。要想成为一个好的架构师,这一环节必不可少。

有兴趣的同学可以去我的github,里面有我的分享的学习过程和blog.
github.com/193Eric




一、http报文

因为缓存机制要用到报文,所以这里简单介绍下http报文。

现在广泛的应用还是HTTP1.1,HTTP1.0已经很少见了。HTTP协议交互的信息被称为HTTP报文。HTTP报文由报文首部、空行(CR+LF)、报文主体。HTTP报文分为请求报文、响应报文。

报文信息主要分为两个部分:


  • 报文头部 请求的附加信息(COOKIE,缓存信息,缓存规则信息,请求类型,请求源Referer等等)

  • 报文内容 HTTP真正想要传输的内容(客户端传输的内容和服务端返回的内容)




二、缓存(强缓存&协商缓存)

这里谈的缓存,主要是浏览器缓存。至于服务器缓存(redis之类的)的就不谈了,不在关联范围。

浏览器是一个主体,一个程序。所以它拥有分配的资源,有存放缓存的资源地带。
正常的首先第一次访问网站的时候,所以先向服务器请求资源,然后客户端拿到,然后存入浏览器缓存地带。
接下来我们可以把浏览器的缓存分为强缓存和协商缓存两种。


强缓存

强缓存是属于不需要访问服务器,直接从浏览器缓存里面拿数据,呈现给客户端。

我们知道,在没有缓存数据的时候,浏览器向服务器请求数据时,服务器会将数据和缓存规则一并返回,缓存规则信息包含在响应header中。对于强缓存来说在header中有两个字段Expires和Cache-Control,**其中Expires 是HTTP 1.0的东西,现在默认浏览器均默认使用HTTP 1.1,所以它的作用基本忽略。**所以我们主要谈Cache-Control。

Cache-Control(主要几个,可以同时存在多个参数,例如:max-age = 60,public)


  • private(默认值) 浏览器可以缓存,打开新窗口会再次访问服务器

  • public 指令指服务器返回不仅可以被浏览器缓存,而且可以被中间代理缓存,后续其他用户请求该资源,都可以直接使用该的缓存。打开新窗口会再次访问服务器(大体上,如css、js这些公共资源需要使用public缓存起来,从而加快页面加载)

  • max-age = xxx(重要) 就是告诉浏览器,缓存内容在多久之后(以秒计算)失效,在这个范围内,强缓存直接命中。在范围内打开新窗口不会访问服务器

  • no-cache 不使用强缓存,使用协商缓存,打开新窗口会再次访问服务器

  • no-store 所以内容都不缓存。(虽然说是为了保护敏感数据,但是基本不考虑。。)

举个例子,如果http请求头带了 Cache-Control:max-age=60,也就是说在60秒之内再次请求这个资源,直接使用强缓存,从浏览器取。

强缓存命中的时候,network状态码是200(from cache)


协商缓存

也就是说需要和服务器协商之后,再判断需要从浏览器拿缓存不。

同样的在第一次发送请求之后,服务器会把一些特定的标识字段返回给客户端,然后客户端交给浏览器缓存起来。当再次请求的时候,客户端将存下来的标识字段通过请求发送给服务端,如果匹配成功,服务器返回304状态码,通知客户端比较成功,可以从浏览器拿缓存数据。(下面画了两个图来理解两次发送)

第一次发送:
在这里插入图片描述

第二次发送:
在这里插入图片描述

标识字段一共有两种:


  • If-Modified-Since(Request header)/ Last-Modified(Response header

  • If-None-Match(Request header)/ Etag(Response header)

上面我们说到,第一次访问的时候,服务器会发送缓存标志给客户端,就是Last-Modified、Etag。客户端拿到后把他们存入浏览器缓存,下次访问的时候通过If-Modified-Since和If-None-Match两个字段发送过去,内容和接收到的是相同的。If-Modified-Since = Last-Modified;If-None-Match = Etag

Last-Modified :服务器返回的资源最后修改时间。

Etag : 当前资源在服务器的唯一标识(规则由服务器决定)。


对比总结

对于强制缓存,服务器通知浏览器一个缓存时间,在缓存时间内,下次请求,直接用缓存,不在时间内,执行协商缓存策略。
对于协商缓存,将缓存信息中的Etag和Last-Modified通过请求发送给服务器,由服务器校验,返回304状态码时,浏览器直接使用缓存。同时Etag的优先级要高于Last-Modified。

在第二次访问的时候,是先判断是否有强缓存,然后再判断协商缓存。具体可以看下面的图:

在这里插入图片描述


推荐阅读
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文详细介绍了解决全栈跨域问题的方法及步骤,包括添加权限、设置Access-Control-Allow-Origin、白名单等。通过这些操作,可以实现在不同服务器上的数据访问,并解决后台报错问题。同时,还提供了解决second页面访问数据的方法。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
author-avatar
sundy柳
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有