美文网首页Java
终于有人把HTTP讲的一清二楚了——缓存篇

终于有人把HTTP讲的一清二楚了——缓存篇

作者: 愿天堂没有BUG | 来源:发表于2022-05-13 14:29 被阅读0次

概述

HTTP协议的缓存是通过6个报文头完成的,通过两层协商使web资源能够不那么频繁地在服务器与客户端之间传递,从而节约了流量,提高浏览速度。以从客户端到服务器的顺序,第一层协商为Cache-Control与Expires;第二层协商为Last-Modified与Etag。

相关的报文头

Cache-Control

请求/响应报文头,缓存控制字段,也就是用于给资源生命期,是http/1.1引入的属性。Cache-Control的取值可细分为两类,一类是对缓存有直接决定性的值,他们会导致后续的第二层协商被跳过,包括:no-store、public、private;另一类是类似Expires的值,只是规定了有效期,后续的第二层协商不受影响,包括no-cache、max-age=x、s-maxage=x。

Cache-Control的取值如下:

形如:

Cache-Control:max-age=0

Expires

响应报文头,代表资源过期时间,由服务器返回提供,是http1.0的属性,在与Cache-Control共存的情况下,优先级要低。Expires的功能基本与Cache-Control的max-age相似,但它是指定一个过期时间点,而Cache-Control的max-age是指定了过期前的秒数。

形如:

Expires:Fri, 10Apr2020 16:30:04GMT

Last-Modified

响应报文头,资源最新修改时间,由服务器告诉浏览器。

形如:

Last-Modified:Mon, 23Mar2020 18:39:50GMT

If-Modified-Since

请求报文头,与Last-Modified相对应,浏览器把服务器最后一次给的Last-Modified返回,服务器将以此进行对比,判断资源是否需要更新。

形如:

If-Modified-Since:Fri, 10Apr2020 14:45:24GMT

Etag

响应报文头,资源内容唯一标识,由服务器告诉浏览器。

形如:

Etag:58b66ccbe349d0d931df877c00d8101d037243dc

If-None-Match

请求报文头,与Etag相对应,浏览器把服务器最后一次给的Etag返回,服务器将以此进行对比,判断资源是否需要更新。

形如:

If-None-Match:58b66ccbe349d0d931df877c00d8101d037243dc

协商流程

以下假定资源已经获取过一次,并且运行在HTTP/1.1环境下,现在进行二次访问。

流程图如下:

说明:

客户端是有可能因为缓存原因不向服务器发起任何请求的,图中200状态(from cache)就是这种情况。

服务器根据回传的If-Modified-Since与Last-Modified比对,如果不同则说明这个文件修改过,需要更新。但在这种判断精度是秒,如果是一秒内的改动,就需要进一步对比回传的If-None-Match与ETag的值。

服务器返回304的意思就是不需要重新获取新资源,直接使用本地缓存即可。

缓存多久合适

生存时间(TTL)指令告诉浏览器应该缓存某个资源多久,即Cache-Control或Expires的值。找到给定资源的最佳TTL值并没有完美的科学方法,只能凭经验给出一些指导原则。

指导原则:

纯静态内容,例如图片或带版本的数据,可以在客户端永久缓存;

CSS/JS和个性化资源,缓存时间大约是会话(交互)平均时间的两倍;

其他类型资源取决于新数据对旧数据的容忍极限。

浏览器操作对HTTP缓存的影响


缓存改进方案

md5/hash缓存:通过不缓存html,为静态文件添加MD5或者hash标识,解决浏览器无法跳过缓存过期时间主动感知文件变化的问题。

CDN缓存:CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。

相关文章

  • 终于有人把HTTP讲的一清二楚了——缓存篇

    概述 HTTP协议的缓存是通过6个报文头完成的,通过两层协商使web资源能够不那么频繁地在服务器与客户端之间传递,...

  • (转)HTTP协议 (四) 缓存

    之前写过一个篇【HTTP协议详解】,这次继续介绍HTTP协议中的缓存机制。HTTP协议提供了非常强大的缓存机制, ...

  • GO编程 -- 简单高效的http缓存服务

    发现一篇用GO语言编写的http缓存服务文章,推荐! 简单高效的http缓存服务 ​

  • [记录]我的日常随笔

    HTTP 从“在浏览器输入域名”到“页面静态资源完全加载”的整个流程 讲一讲强缓存和协议缓存? 有了【Last-M...

  • 终于有人把Elasticsearch原理讲透了!

    终于有人把Elasticsearch原理讲透了! 小史是一个非科班的程序员,虽然学的是电子专业,但是通过自己的努力...

  • axios cache前端数据缓存

    提示这里讲的前端缓存是指前端对接口数据的缓存处理,而不是通过 HTTP(s)缓存 GITHUB[https://s...

  • HTTP 缓存策略:强缓存和协商缓存

    大家好,我是前端西瓜哥。今天讲一下 HTTP 缓存策略的强缓存和协商缓存。 缓存是什么? 缓存(Cache)是一种...

  • 前端缓存

    前端缓存 提示这里讲的前端缓存是指前端对接口数据的缓存处理,而不是通过 HTTP(s)缓存 前言 通常会在项目中有...

  • Tomcat环境下设置HTTP强缓存

      在之前的一篇文章 《HTTP缓存详解》 中详细的整理了关于HTTP缓存的知识点,这一篇通过实践,具体验证如何设...

  • HTTP缓存原理

    什么是HTTP缓存 HTTP缓存通常指浏览器缓存,基于HTTP中header字段实现HTTP缓存分为强缓存和协商缓...

网友评论

    本文标题:终于有人把HTTP讲的一清二楚了——缓存篇

    本文链接:https://www.haomeiwen.com/subject/yttuurtx.html