首页/文章/http-网络

HTTP缓存:别傻傻不会回答了

2024-09-02
16466 分钟
...

前言

在有大量数据交换的应用程序中,我们会采取一些方式将那些实时性要求不高的数据生成副本,并存储在某个相对来说可以快速到达、访问、获取的仓库,这样在需要这些数据的时候可以直接从这个仓库中获取数据。

缓存的目的:

  • 提升数据交换的性能,提高速度。

  • 缓解服务器或数据库的压力。

HTTP 根据是否要向服务器发送请求将缓存规则分为两类:强缓存和协商缓存。

强缓存

在强缓存中,如果命中缓存,则直接从缓存数据库中取出资源,无需再发送请求到服务器上。

如果没命中缓存,则走协商缓存。

判断是否命中强缓存的字段为 ExpiresCache-ControlCache-Control 的优先级高于 Expires

1、Expires

Expires 字段是 HTTP1.0 的产物,它的值是一个绝对时间,表示资源在这个时间点之前都可以直接从缓存中获取。

2、Cache-Control

Cache-Control 字段是 HTTP1.1 的产物,它的值是一个相对时间。

Cache-Control 常见字段的含义:

  • public:表示响应可以被任何对象缓存,包括客户端、CDN 代理服务器等。即使是通常不可缓存的内容,例如该响应没有 max-age 指令或 Expires 消息头。

  • private:表示响应只能被单个用户缓存,不能作为共享缓存(代理服务器不能缓存它)。

  • no-cache:可以在本地进行缓存,但每次获取资源时,都需要向服务器进行验证,如果服务器允许,才能使用本地缓存。即:需要协商缓存。

  • no-store:禁止缓存内容,每次必须重新请求服务器获取内容。

  • max-age:设置缓存存储的最大周期,超过这个时间,缓存被视为过期。单位:秒。

强缓存的状态码为 200,状态码后会有个注释。

  • from memory cache:缓存资源在内存中,浏览器(或页面标签)关闭后,内存中的缓存就会被释放,重新打开页面取不到该缓存。

  • from disk cache:缓存资源在磁盘中,浏览器(或页面标签)关闭后,磁盘中的缓存不会被释放,重新打开页面还可以从磁盘中获取。

如果不想从强缓存中获取资源,windows 电脑通过 ctrl + f5 刷新页面,mac 可通过 shift + command + r 刷新页面,刷新后不会出现 from disk(or memory) cache。

协商缓存

协商缓存是需要经过服务器确认是否使用缓存的机制。

服务器对比客户端提供的标识,若确认缓存可以使用,则返回 304 状态码告知客户端可使用缓存,否则返回 200 状态码和新资源。

虽然客户端仍然发起了请求,但服务器仅仅对比标识来确认是否可使用缓存,如果确认使用缓存就不会返回具体资源。这样虽然没有减少请求数量,但也极大地降低了服务器的负荷,可以提升请求速度和减小网络带宽。

协商缓存的两组字段:Last-Modified / If-Modified-SinceEtag / If-None-Match

1、Last-Modified / If-Modified-Since

Last-Modified 代表资源最后的修改时间。

当客户端第一次请求资源时,服务器会在响应头返回 Last-Modified 字段。当客户端再次访问这个资源时,会在请求头中携带 If-Modified-Since 字段,它的值就是上次返回的 Last-Modified 字段的值。

服务器会对比 If-Modified-Since 字段和资源上次修改的时间,确认这段时间内是否有修改。如果没有,则返回 304,否则返回 200 状态码和最新资源。

2、Etag / If-None-Match

Last-Modified / If-Modified-Since 这组字段会存在以下问题:

  • 某些文件会周期性更改,但只是改变了文件的修改时间,文件的内容没有发生改变。这个时候我们并不希望客户端认为这个文件更新了,重新请求。

  • 某些文件修改非常频繁,例如在秒级别以下的时间进行修改(1秒内修改多次)。Last-Modified / If-Modified-Since 检查的时间粒度是秒级,因此无法正确判断这种情况。

  • 某些服务器不能精确得到文件的最后修改时间。

Etag / If-None-Match 这组字段可以解决上述问题。Etag 通过一个校验码来对比资源是否更改过,而非通过资源的修改时间。

当一个资源的内容发生变化时,它的校验码也会发生改变。

当客户端第一次请求资源时,服务器会在响应头返回 Etag 字段。当客户端再次访问这个资源时,会在请求头中携带 If-None-Match 字段,它的值就是上次返回的 Etag 字段的值。

服务器对比校验码,确认资源是否更改过。如果没有,则返回 304,否则返回 200 状态码和最新资源。

Etag 的优先级高于 Last-Modified。

总结

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
http-网络2025-08-06
按下回车后网页是怎么出来的
当你在浏览器中输入一个网址,比如 ,然后按下回车键,几秒钟后页面就完整地呈现在你眼前。这个看似简单的操作,背后其实是一整套精密协作的网络机制在起作用。本文将带你从基础讲起,理解 Web 开发中最重要的网络知识,帮助你搞清楚: 数据是如何从服务器传到你的电脑,并最终变成网页的? 一、互联网通信的分层模型:OSI 七层模型 为了管理复杂的网络通信,工程师们提出了一个通用的参考模型—— OSI 七层模型 。它把整个通信过程划分为七个层次,每一...
学习面试
http-网络2025-03-04
网络代理详解
一、 的基础概念 1\. 什么是代理? 代理是一种通过中间服务器来帮助 访问目标服务器的技术。代理服务器位于客户端与服务器之间,充当两者的中介,从而实现客户端和服务器之间的隔离。用户的所有请求经过代理后,再发往目标服务器,而目标服务器的响应则返回代理,再由代理传递给用户。 2\. 网络代理的工作流程 在基本的网络代理工作流程中, 扮演了“请求转发者”和“响应返回者”的角色: 1. 客户端请求 :客户端将请求发送到代理服务器,而不是直接发...
学习面试
http-网络2024-11-29
没有koa的cors你怎么处理跨域?
关联问题: JSONP有何局限性 CORS如何处理复杂请求 代理在生产环境效果如何 前言 “金九银十”的秋招,就像是落进池塘的羽毛,连点水花都没砸起来。已读不回是常态,能给面试已是情分,能拿offer的更是少之又少。可怜我在寒潮来临的深秋之际,也只得哀叹一句“越来越冷了啊...” 不过人总是要吃饭的,所以再怎么冷,卖炭翁也得卖炭,牛马攻城狮也得“攻城”,既是为了填饱肚子,也是为了“春天”做准备。所以今天为各位前端工程狮细聊一下前端面试中...
学习面试
http-网络2024-09-11
面试常客系列之跨域前言
跨域?什么是跨域呢?我们先来看看一个url的组成, ,这一个url我们可以分成四部分来看 是协议, 是域名, 是端口, 是路径.在浏览器中,我们从一个域名发送请求到另一个域名,如果两个域名的协议,域名,端口三部分只要存在一部分不同就会发生跨域,也就是说只有两个域名的协议,域名,端口都相同才会不会发生跨域,所以我们又如何解决跨域的问题呢?在下文中会给大家介绍几种方法去解决跨域问题. 那么要解决跨域就不得不谈及 ,同源策略是一种安全措施,用...
学习面试
http-网络2024-08-19
网络-navigator.sendBeacon前言
navigator.sendBeacon 是浏览器的 API,用于在浏览器后台发送异步请求,它不会等服务端响应。 它可以用于在页面卸载或关闭的时候,发送数据,以及在不阻塞页面卸载的情况下发送数据。 使用 方法发送的请求是异步的,不会阻塞页面的卸载或关闭过程。 这对于需要在用户离开页面之前发送数据的情况非常有用。 优点 不受页面卸载过程的影响,确保数据可靠发送。 普通的 请求如 和 在页面关闭或者刷新、前进、后退等操作时 , 这些请求有可...
学习面试
http-网络2024-08-16
前端项目中的Server-sent Events(SSE)项目实践及其与websocket的区别在前端开发中,实时数据更
前端项目中的 项目实践 前言 在前端开发中,实时数据更新是提升用户体验的重要因素之一。 是一种高效的技术,允许服务器通过单向连接将实时数据推送到客户端。下面将从 的基本改变,使用场景展开了解,并提供一个实际案例来更好的理解如何在前端项目中应用 。 的主要特点 1. 单项数据流:数据从服务器推送到客户端。 2. 自动重连:在链接丢失时,浏览器会自动尝试重新链接。 3. 简单易用:基于 协议,不需要额外的库或协议。 的使用场景 适用于需要从...
学习面试

评论

请登录后发表评论

去登录
加载评论中...

目录