热门标签 | 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。

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

在这里插入图片描述


推荐阅读
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • 本文将介绍如何在混合开发(Hybrid)应用中实现Native与HTML5的交互,包括基本概念、学习目标以及具体的实现步骤。 ... [详细]
  • HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送www方式的数据。HTTP协议采用了请求响应模型。客服端向服务器发送一 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • 本文介绍了多种开源数据库及其核心数据结构和算法,包括MySQL的B+树、MVCC和WAL,MongoDB的tokuDB和cola,boltDB的追加仅树和mmap,levelDB的LSM树,以及内存缓存中的一致性哈希。 ... [详细]
  • Framework7:构建跨平台移动应用的高效框架
    Framework7 是一个开源免费的框架,适用于开发混合移动应用(原生与HTML混合)或iOS&Android风格的Web应用。此外,它还可以作为原型开发工具,帮助开发者快速创建应用原型。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 本文详细介绍了 HTML 中 a 标签的 href 属性的多种用法,包括实现超链接、锚点以及调用 JavaScript 方法。通过具体的示例和解释,帮助开发者更好地理解和应用这些技术。 ... [详细]
  • 近期,微信公众平台上的HTML5游戏引起了广泛讨论,预示着HTML5游戏将迎来新的发展机遇。磊友科技的赵霏,作为一名HTML5技术的倡导者,分享了他在微信平台上开发HTML5游戏的经验和见解。 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • 网络爬虫的规范与限制
    本文探讨了网络爬虫引发的问题及其解决方案,重点介绍了Robots协议的作用和使用方法,旨在为网络爬虫的合理使用提供指导。 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
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社区 版权所有