我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

大家好,我是前端西瓜哥。今天讲一下 HTTP 缓存策略的强缓存和协商缓存。

缓存是什么?

缓存(Cache)是一种数据存储技术,广泛应用在电脑工程领域。

它将原本访问起来较慢的数据,放到访问更快的存储介质中,当第二次访问时,能够更快地访问数据,是一种 空间换时间 的做法。

比如,有个文件经常被读取,且很少改变,那我们就直接将其缓存到内存中,节省掉耗时的 IO 磁盘读取时间。

再比如,在写代码时,我们的一个方法会接受参数,然后计算返回一个结果,假设这个计算过程非常耗时,且结果值只依赖传入的参数。

那我们就可以将参数和结果的对应映射,保存到哈希表中,下次如果是相同参数,就能命中然后直接从哈希表里获取,速度有了极大提升。

HTTP 缓存也是一样的道理,用户通过 HTTP 请求访问的资源会缓存到本地,在用户第二次访问相同资源时,直接使用之前缓存的资源。

当然资源可能并不一定是不变的,在必要的时候需要更新缓存。为此我们可能需要设置一下缓存的有效期,或是发送一个占用带宽小的请求询问服务端等等。

这些,就是 HTTP 缓存策略。

强缓存

强缓存,指的是 让浏览器强制缓存服务端提供的资源。

“东西就给你了,没事别找我。”

Cache-Control: max-age=

响应头字段 Cache-Control,通过设置 max-age=,可以规定资源的缓存有效时间长度,单位为秒。

需要注意的是 Cache-Control 是通用头字段,请求头和响应头中都可以使用。

响应头字段的 Cache-Control 用于告知客户端如何缓存资源。

客户端的 Cache-Control 则是告知服务器需要多新鲜的资源,比如 no-cache 或 max-age=0 表示要最新鲜的资源。

Cache-Control: max-age=31536000

在浏览器 devtool 的 network 面板,我们看到 from disk cache 的字样,代表这个资源并没有去发送请求,而是使用了来自硬盘的缓存。

如果你不停地刷新页面,你还会看到 from memory cache :来自内存的缓存。因为刷新前资源正在使用,还在内存中,刷新后浏览器就直接从内存中取出来了。

当你强制刷新时,浏览器会在请求头中加上 Cache-Control: no-cache 或是 Cache-Control: max-age=0,要求服务端返回最新资源。

Expires

Cache-Control: max-age= ,是缓存的有效时长。

当看到一个叫 max-age(有效时长)的东西时,我们经常会发现它的孪生兄弟:Expires(过期时间点)。如果你熟悉 Cookies,你会发现 Cookies 也有这么一对属性。

Expires: Wed, 21 Oct 2015 07:28:00 GMT

Expires 使用的 GMT 格式的时间戳字符串。

当 max-age 和 Expires 都存在时,使用 max-age。这点和 Cookies 一样。

强缓存,就是让浏览器将资源缓存下来,在缓存过期前,不发送请求获取新资源,而是直接使用本地资源。

协商缓存

协商缓存,是在缓存过期的情况下,客户端和服务端协商,确认客户端缓存是否需要更新。

Last-Modified 和 If-Modified-Since

响应头字段 Last-Modified 表示提供的资源最后被修改的时间。值是 GMT 格式的字符串。

Last-Modified: Sat, 09 Apr 2022 14:47:36 GMT

这个时间会标记在对应缓存上,起到标识的作用。

当浏览器的缓存失效后,会再次请求服务端,并带上 If-Modified-Since 请求头字段,它的值就是之前 Last-Modified 带过来的值。

If-Modified-Since: Sat, 09 Apr 2022 14:47:36 GMT

当服务端发现资源最后修改时间和 If-modified-since 值相等,代表资源从该时间后再未改变过。

服务端于是返回 304(Not Modified)状态码,表示资源没有改变,并且响应体为空。浏览器拿到后,就知道原本可能过期的缓存其实还可以继续使用。

如果资源改变了,就会返回 200,且响应体带上最新资源。

ETag 和 If-None-Match

除了用 Last-Modified 代表的资源最后修改时间作为标识,我们还可以使用 ETag 响应头。

ETag 的值没有规定,你可以是时间戳的哈希值,也可以是版本号。

另外 ETag 分为强 ETag 和弱 ETag,其中弱 ETag 以为 W/ 开头。

ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
ETag: W/"0815"

然后和 If-Modified-Since 一样,当缓存过期时,客户端会在请求头带上 If-None-Match 去请求资源。

If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"

如果资源依旧新鲜,则返回 304,客户端继续复用本地资源。

结尾

强缓存,设置一个过期时间,让客户端在过期前使用本地缓存,直到过期才请求更新鲜的资源。涉及的头字段有 Cache-Control: max-age= 或 Expires 。

协商缓存,在客户端缓存过期的情况下,和服务端协商一下,是否可以继续使用本地缓存。涉及的头字段有 Last-Modified / If-Modified-Since 和 ETag / If-None-Match。

不过需要注意的是,这些都只是规范,我们无法确定客户端或服务端在实现上完全遵循,而且可能在版本更新中会出现一些 bug。

所以对于发生变化的文件,我更倾向于给文件名加上哈希串。毕竟,访问一个从来没访问过的资源,客户端是不会有缓存的。这样就能绕开缓存机制,真正拿到最新资源,而不会掉入缓存陷阱。

参考

  • RFC7234 - Request Cache-Control Directives:https://www.rfc-editor.org/rfc/rfc7234#section-5.2.1。
  • RFC7232 - Weak versus Strong:https://www.rfc-editor.org/rfc/rfc7232#section-2.1。
  • stackoverflow - What takes precedence: the ETag or Last-Modified HTTP header?:https://stackoverflow.com/questions/824152/what-takes-precedence-the-etag-or-last-modified-http-header。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

缓存(Cache)是一种数据存储技术,广泛应用在电脑工程领域。
CacheHTTP2024-12-02

HTTP 2.0面试通关:强制缓存和协商缓存

超文本传输协议(HyperText Transfer Protocol,HTTP)是目前使用最广泛的应用层协议。 在网站、App、开放接口中都可以看到它。HTTP 协议设计非常简单,但是涵盖的内容很多。相信你平时工作中已经多多少少接触过这个

node强缓存和协商缓存怎么实现

这篇文章主要介绍了node强缓存和协商缓存怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇node强缓存和协商缓存怎么实现文章都会有所收获,下面我们一起来看看吧。什么是浏览器缓存浏览器缓存(http 缓存
2023-07-02

探索HTTP缓存机制:了解常见的缓存策略

解密HTTP缓存机制:你知道有哪些常见的缓存策略吗?HTTP缓存机制是Web开发中非常重要的一部分,它可以提高网站的性能和用户体验。通过缓存,用户可以更快地加载网页内容,并减轻服务器的负载。然而,为了正确地使用缓存机制,我们需要了解其中的
探索HTTP缓存机制:了解常见的缓存策略
2024-01-23

js前端面试常见浏览器缓存强缓存及协商缓存的方法

这篇文章主要介绍“js前端面试常见浏览器缓存强缓存及协商缓存的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“js前端面试常见浏览器缓存强缓存及协商缓存的方法”文章能帮助大家解决问题。前言浏览器缓
2023-07-02

Android | LruCache缓存策略

LruCache适用于需要缓存一些频繁访问的数据,并且需要限制缓存大小的场景。它可以提高数据访问的速度和性能,并且可以避免内存溢出的问题。
LruCacheAndroid2024-11-30

详解缓存:缓存中存在的挑战及策略

缓存基本上分为两种:本地缓存和远程缓存。本地缓存依靠JVW(Java虚拟机)堆进行储存,而远程(或集群)缓存使用内存存储器,如Redis和Memcached。

探究HTTP缓存的奥秘:掌握各种缓存策略的了解

深入剖析HTTP缓存机制:了解不同的缓存策略有哪些?引言:在互联网的时代,网络性能往往成为用户体验的关键因素之一,而HTTP缓存机制作为一种优化手段,可以提升网页的加载速度,减轻服务器的负载,提高用户体验。本文将深入剖析HTTP缓存机制,
探究HTTP缓存的奥秘:掌握各种缓存策略的了解
2024-01-23

HTTP缓存协议实战

做为客户端开发,经常出现一些与cache相关的问题在排查时无从下手,通过学习了解这部分内容,可以帮助快速的分析定位这部分问题。

Python怎么使用LRU缓存策略进行缓存

本文小编为大家详细介绍“Python怎么使用LRU缓存策略进行缓存”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python怎么使用LRU缓存策略进行缓存”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、Pyt
2023-07-06

Python如何使用LRU缓存策略进行缓存

本文小编为大家详细介绍“Python如何使用LRU缓存策略进行缓存”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python如何使用LRU缓存策略进行缓存”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、Pyt
2023-06-30

JuiceFS 缓存策略详解

对于一个由对象存储和数据库组合驱动的文件系统,缓存是本地客户端与远端服务之间高效交互的重要纽带。读写的数据可以提前或者异步载入缓存,再由客户端在后台与远端服务交互执行异步上传或预取数据。相比直接与远端服务交互,采用缓存技术可以大大降低存储操作的延时并提高数据吞
JuiceFS 缓存策略详解
2014-10-24

Java Integer的缓存策略

Java5为Integer的操作引入了一个新的特性,用来节省内存和提高性能。整型对象在内部实现中通过使用相同的对象引用实现了缓存和重用。上面的规则默认适用于整数区间 -128 到 +127(这个整数区间可以通过启动应用的虚拟机参数修改:-X
2023-06-02

MySQL缓存策略详解

MySQL缓存方案 一、MySQL缓存方案目的分析1.1、缓存层的作用1.2、缓存层选择1.3、场景分析 二、提升MySQL访问性能的方式2.1、MySQL主从复制2.2、读写分离2.3、连接池2.4、异步连接 三、redi
2023-08-25

Android图片三级缓存策略(网络、本地、内存缓存)

一、简介 现在的Android应用程序中,不可避免的都会使用到图片,如果每次加载图片的时候都要从网络重新拉取,这样不但很耗费用户的流量,而且图片加载的也会很慢,用户体验很不好。所以一个应用的图片缓存策略是很重要的。通常情况下,Android
2022-06-06

C#开发中如何处理分布式缓存和缓存策略

C#开发中如何处理分布式缓存和缓存策略引言:在当今高度互联的信息时代,应用程序的性能和响应速度对于用户的体验至关重要。而缓存是提高应用程序性能的重要方法之一。在分布式系统中,处理缓存和制定缓存策略变得尤为重要,因为分布式系统的复杂性往往会带
2023-10-22

热门标签

编程热搜

编程资源站

目录