热门标签 | 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许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
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社区 版权所有