Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >HTTP缓存(Cache-Control、Expires 、ETag)

HTTP缓存(Cache-Control、Expires 、ETag)

作者头像
代码之风
发布于 2018-10-31 03:38:08
发布于 2018-10-31 03:38:08
5.6K0
举报
文章被收录于专栏:马涛涛的专栏马涛涛的专栏

HTTP缓存

HTTP缓存( ETag、Cache-Control)——谷歌开发者 HTTP缓存有利于web性能优化

Cache-Control

例子

假设我们首页有一个请求,请求js文件 <script src="./main.js"></script> 如何让CSS和JS请求速度加快?

此时打开首页

发现这个文件大小为279KB,使用时间为382ms

如果再次刷新首页,那么这个文件还会被再次请求一次。那么如何重复利用之前获取的资源而不用反复请求呢?答案是HTTP缓存,这是性能优化的一个重要方面。

接下来在响应里设置响应头 Cache-Control: max-age=30 刷新两次首页

第二次的时间为0 响应头中的Cache-Control: max-age=30表示客户端将这个缓存最多 保存30 秒,30秒后再次请求文件将会再次下载

即: 设置这个响应头之后,浏览器请求时发现是相同的URL,浏览器直接从内存里返回已经缓存的main.js,没有向服务器发出请求

问题

  1. 为什么首页不设置Cache-Control呢? 如果首页缓存,刷新首页的时候根本不会请求服务器,那么如果服务器更新了代码,浏览器将没有办法接收到新的版本。一般首页,HTML不要设置Cache-Control。js和css要设置久一点例如10年,即一直保留有缓存。
  2. 那么js和css更新了怎么办? 浏览器请求时发现是相同的URL才使用缓存,那么可以设置查询参数,例如第二个版本的js可以写<script src="./main.js?v=2"></script>,来保证URL的不同,重新获取新的js文件。这样即可以缓存很久,又可以随时更新

例如知乎的网页里的请求:

总结

通过网络获取内容既速度缓慢又开销巨大。较大的响应需要在客户端与服务器之间进行多次往返通信,这会延迟浏览器获得和处理内容的时间,还会增加访问者的流量费用。因此,缓存并重复利用之前获取的资源的能力成为性能优化的一个关键方面。好在每个浏览器都自带了 HTTP 缓存实现功能。您只需要确保每个服务器响应都提供正确的 HTTP 标头指令,以指示浏览器何时可以缓存响应以及可以缓存多久。

Expires

  1. Expires 是以前用来控制缓存的http头,Cache-Control是新版的API
  2. 现在首选 Cache-Control。
  3. 如果在Cache-Control响应头设置了 "max-age" 或者 "s-max-age" 指令,那么 Expires 头会被忽略。
  4. 响应头设置方式: Expires: Wed, 21 Oct 2015 07:28:00 GMT
  5. Expires 响应头包含日期/时间, 即在此时候之后,响应过期

注意: 因为过期标准的时间用的是本地时间,所以不靠谱,所以要游侠使用Cache-Control代替Expires

区别
  1. Cache-Control设置时间长度
  2. Expires 设置时间点

详细:Expires - HTTP | MDN

MD5

MD5是消息摘要算法。用于确保信息传输完整一致

具体作用这样

接受一个String 或 Buffer,返回一个固定的String

如果接受的String改变,那么返回的String也会改变 例如将1.txt中的其中一个1改为0,那么返回值如下

可见返回至完全改变了 这个特性可以用来判断两次信息传输是否完整一致

ETag

例子:

例如我们请求一个js文件。 设置一个ETag响应头

设置的ETage响应头为这个JS文件的MD5值 查看响应:

那么:下一次请求这个JS的时候,浏览器会把上一次响应的那个ETage的值放到If-None-Match里面,如图:

这样做的作用是:如果请求和响应的MD5一样,说明不需要重新下载这个js文件。这时我们修改代码:

如果MD5一样,说明文件没改过,那么返回304

304 Not Modified: HTTP 304 未改变说明无需再次传输请求的内容,也就是说可以使用缓存的内容。

HTTP 304 没有响应体,因为不需要下载响应内容,直接用缓存就行了

ETag与 Cache-Control的区别

假设我们请求两个文件,CSS文件使用Cache-Control缓存,js文件使用ETag。 代码如下:

两个请求区别:

所以:

  • 由于CSS的请求是用缓存(Cache-Control)的,所以直接不发请求
  • 而js用的ETag,有请求也有响应,只不过如果MD5一样,那么就不下载响应体
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-10-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
浏览器缓存 Last-Modified / Etag / Expires / Cache-Control 详解
浏览器缓存,又称 HTTP 缓存,指的是:当我们浏览网站的时候,器存储会在本地存储一个副本,以便下次访问同个网址的时候可以不再连接服务器,直接使用本地的缓存。服务器端程序可以通过 HTTP Cache Headers 来控制缓存行为,减轻服务器的负担,缩短了响应时间,显著得提高网站的性能。
Denis
2023/04/14
1.3K0
浏览器缓存 Last-Modified / Etag / Expires / Cache-Control 详解
HTTP(二) 缓存
重用已获取的资源能够有效的提升网站与应用的性能。Web 缓存能够减少延迟与网络阻塞,进而减少显示某个资源所用的时间。借助 HTTP 缓存,Web 站点变得更具有响应性。
黑伞安全
2019/10/16
4540
HTTP(二) 缓存
一文读懂浏览器缓存
浏览器缓存一直是个老生常谈的话题,也是面试官常常用来鉴别面试者的利器,作为前端来讲这块知识是属于必须掌握的,再者利用好缓存也是做性能优化的有效方法。本文将从缓存原因、缓存读写顺序,缓存位置以及缓存策略这几个角度介绍浏览器缓存,并且最后给出实践的应用举例。
用户4456933
2021/06/01
4640
一文读懂浏览器缓存
通过 Node.js 小示例学习浏览器缓存策略
在后端为了加速服务的访问速度,通常可以使用 Memcached、Redis 做数据缓存,那么在浏览器端又有哪些缓存策略呢?
五月君
2020/09/17
1.4K0
Nginx下关于缓存控制字段cache-control的配置说明 - 运维小结
HTTP协议的Cache -Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置 Cache-Control并不会影响另一个消息处理过程中的缓存处理过程。 请求时的缓存指令包括: no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached等。 响应消息中的指令包括: public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age。
洗尽了浮华
2019/05/25
9.5K0
HTTP缓存机制的Etag、Last-Modified、If-None-Match和If-Modified-Since、Expires和Cache-Control笔记
    Etag由服务器端生成,客户端通过If-None-Match这个条件请求来验证资源是否修改。请求一个文件的流程可能如下:
砖业洋__
2023/05/06
2.8K0
HTTP缓存机制的Etag、Last-Modified、If-None-Match和If-Modified-Since、Expires和Cache-Control笔记
Web缓存 - HTTP协议缓存
Web缓存一般分为浏览器缓存、代理服务器缓存以及网关缓存,本文主要讲的是 浏览器缓存,其它两种缓存大家自行去了解下。
laixiangran
2018/07/25
1K0
Web缓存 - HTTP协议缓存
HTTP缓存相关知识介绍
HTTP协议的缓存是通过6个报文头完成的,通过两层协商使web资源能够不那么频繁地在服务器与客户端之间传递,从而节约了流量,提高浏览速度。以从客户端到服务器的顺序,第一层协商为Cache-Control与Expires;第二层协商为Last-Modified与Etag。
小明互联网技术分享社区
2022/02/17
3190
HTTP缓存相关知识介绍
前端性能优化(二)——浏览器缓存机制
浏览器缓存对于前端一点都不陌生,最常见的就是,新版本上线了,测试却说这怎么还没有变化呢?使用 ctr + F5 强制刷新之后,立马就好了。或者清除浏览器缓存,按住ctr+shift+delete,弹出如图:
呆呆
2021/09/30
5230
了解 Session、LocatStorage、Cache-Control、ETag
由于 HTTP 协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是 Session. 典型的场景比如购物车,当你点击下单按钮时,由于 HTTP 协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的 Session,用用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。这个 Session 是保存在服务端的,有一个唯一标识。在服务端保存 Session 的方法很多,内存、数据库、文件都有。集群的时候也要考虑 Session 的转移,在大型的网站,一般会有专门的 Session 服务器集群,用来保存用户会话,这个时候 Session 信息都是放在内存的,使用一些缓存服务比如 Memcached 之类的来放 Session。
CRMEB商城源码
2022/06/14
9120
了解 Session、LocatStorage、Cache-Control、ETag
HTTP缓存控制小结
IMWeb前端团队
2017/12/29
1.3K0
HTTP缓存控制小结
图解 HTTP 缓存
本文首发于政采云前端团队博客:图解 HTTP 缓存 https://www.zoo.team/article/http-cache
前端劝退师
2020/05/20
6550
跟我一起探索 HTTP-HTTP缓存
可复用性有几个优点。首先,由于不需要将请求传递到源服务器,因此客户端和缓存越近,响应速度就越快。最典型的例子是浏览器本身为浏览器请求存储缓存。
用户1418987
2023/10/16
4510
跟我一起探索 HTTP-HTTP缓存
HTTP 缓存
Cache 的设计是个基础计算机理论,也是程序员的重要基本功之一。Cache 几乎无处不在,CPU 的 L1 L2 L3 Cache、iOS 系统的 clean page 和 dirty page 机制、HTTP 的 tag 机制等等,这些背后都是 Cache 设计思想的应用。 上一篇介绍了关于 HTTP 的基础知识,本篇对 HTTP Cache 做一个完整的介绍。
1ess
2021/10/29
7200
HTTP 缓存
亿及流量多级缓存 - 客户端缓存
在HTTP协议中If-Modified-Since和If-None-Match分别对应Last-Modified和ETag
Parker
2020/07/22
9430
HTTP缓存,浏览器缓存
可分为两大类:http缓存和浏览器缓存。我们今天重点讲的是http缓存,所以关于浏览器缓存大家自行去查阅。下面这张图是前端缓存的一个大致知识点:
回忆大大
2023/03/19
1.1K0
HTTP缓存,浏览器缓存
浏览器 HTTP 协议缓存机制详解
最近在准备优化日志请求时遇到了一些令人疑惑的问题,比如为什么响应头里出现了两个 cache control、为什么明明设置了 no cache 却还是发请求,为什么多次访问时有时请求里带了 etag,有时又没有带?等等。。。 后来查了一些资料以及同事亲自验证,总算对这些问题有了个清晰的理解,现在整理出来以备忘。 1、缓存的分类 缓存分为服务端侧(server side,比如 Nginx、Apache)和客户端侧(client side,比如 web browser)。 服务端缓存又分为 代理服务器缓存 和
用户1177713
2018/02/24
1.5K0
浏览器 HTTP 协议缓存机制详解
http缓存与离线缓存
一、http协议实现缓存 1. 缓存头部 通用缓存、条件缓存、缓存控制三大类 头部名称 说明 请求/响应 通用缓存头部 控制客户端是否向服务器发送请求或者是服务端响应请求 cache-control 用于随报文传递的缓存提示 pragma http1.0的,等于cache-control:no-cache,pragma优先级高于expires 条件头部 Last-Modified 服务器响应时将文本最后修改时间放在此头部一起传送,如:Last-Modified:
sam dragon
2018/01/17
1.6K0
http缓存与离线缓存
HTTP 缓存机制
Web 缓存大致可以分为:数据库缓存、服务器端缓存(代理服务器缓存、CDN 缓存)、浏览器缓存。
chuchur
2022/10/25
8330
HTTP 缓存机制
负载均衡环境中和如何设置Expires和Etag
在负载均衡环境中(LVS, LoadBalance)为了减少浏览器数据的重复请求操作,一般需要设置 Http Header 的 Etage 和 Expires 告诉浏览器请求数据是否已过期。以下内容主要考虑Apache+squid 环境
Java架构师必看
2020/10/23
9660
相关推荐
浏览器缓存 Last-Modified / Etag / Expires / Cache-Control 详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档