面试官:讲一下HTTP缓存...

326 阅读6分钟

前言

不知道各位有没有在面试中被拷打HTTP缓存策略的经历,那到底什么是HTTP缓存? HTTP缓存具体有什么作用? HTTP缓存的策略是什么? 今天我们就来简单了解一下HTTP缓存

HTTP简介

HTTP缓存是一种在客户端或服务端临时存储资源(HTML,CSS,JS文件,图片等)的机制。每当浏览器请求相同资源的时候,不是直接从服务端获取,而是看本地有没有相同请求,如果有就直接从本地获取。如果资源更新,那下次请求时则从服务端获取并保存到本地。

这样做的好处有:

  • 减少请求次数,减轻服务端压力;
  • 减少网页响应时间,增加用户体验;
  • 减少网络带宽,减少用户流量消耗;

HTTP缓存流程

  1. 浏览器向服务端发送请求
  2. 服务端收到浏览器发送过来的请求,返回资源,并在响应头加上对应的缓存标识
  3. 浏览器接收到响应,根据响应报文中缓存标识(如Cache-Control,Etag,Last-Modified 与 If-Modified-Since等)做出对应的缓存策略
  4. 浏览器下次发送同样的请求,先在本地查找有没有对应的缓存,如果有直接返回结果

为了更加直白的演示,我们可以看一下简单的流程图:

image.png

HTTP缓存策略

根据缓存策略的不同,HTTP缓存策略可以分为强缓存和协商缓存。

强缓存

强缓存是指在浏览器请求资源时,优先判断本地缓存是否可用。若缓存未过期,则无需向服务端发送请求,直接返回本地的缓存。其核心依赖于响应头中的Cache Control和Expires字段

Cache Contorl: 通过指定有效时间实现浏览器精准缓存的关键字段,有以下几个常用指令

常用指令作用
max-age指定缓存过期的时间,以秒为单位。在该时间内,浏览器直接从本地缓存
pubcic表示资源可以被中间任何代理服务器缓存,适用于不需要用户验证的公共资源
private表示该资源只有客户端可以缓存,常用于用户私密资源
no-cache强制浏览器在使用缓存前,必须先向服务器发送请求进行验证。
no-store表示禁止任何缓存,每次请求资源都向服务端发送新的请求

Expires: 指定资源过期的绝对时间,但由于依赖服务器与客户端的时间同步,存在误差风险,逐渐被 Cache-Control 替代。

Expires: Wed, 15 Apr 2026 03:19:25 GMT

强缓存的优势在于极大地减少了网络请求的次数。若是过期时间到了,浏览器又会怎么处理呢?

协商缓存

当强缓存失效时,协商缓存发挥作用。浏览器就会携带缓存标签向服务端发送请求,确认资源是否发生变化。如果没有发生变化,则返回304状态,让浏览器使用本地缓存。如果发生变化,则返回200状态,重新返回资源,浏览器会将收到的资源重新缓存到本地。

协商缓存主要依靠 ETagLast-Modified 两组字段

ETag/If-None-Match: 服务端为资源生成的唯一指纹ETag,浏览器再次发送请求时携带If-None-Match,服务端通过比对过后,若资源未修改,返回304状态,浏览器直接使用本地缓存,若资源已修改,则返回新的资源。

Last-Modified/If-Modidied-Sence: 作用机制与ETag类似,不同的是Last—Modified通过是通过资源最后的修改时间进行比对。

两者对比

精确度上:ETag是通过服务端计算出来的hash值作为标识,而Last-Modified是通过时间作为标识且单位为秒,如果资源在一秒内连续变化,那么Last-Modified就不能准确得到最新的数据。

性能上: ETag是通过计算得出的hash值,无疑增加了服务端负载,而Last-Modified只是返回一个时间。在性能上Modified要优于ETag。

服务器需要同时考虑精准度和性能问题,服务器可依据资源特性灵活选择或组合使用 ETag 与 Last-Modified。

总结

通过协商缓存,即使强缓存失效,也能通过少量数据交换(仅验证标识)避免重复传输完整资源,在动态内容更新场景中尤为重要。

协商缓存和强缓存并非孤立存在,而是相互配合、分阶段发挥作用,共同构建高效的 HTTP 缓存体系。

缓存位置

那么从HTTP缓存的资源放在哪里呢? HTTP缓存资源的位置主要分为客户端缓存和服务端缓存。

客户端缓存

客户端缓存可以分为内存缓存和磁盘缓存。

  1. 内存缓存是位于浏览器运行时占用的内容空间中,是浏览器优先使用的缓存区域。其特点是读写速度特别快,适用于需要快速响应的资源。
  2. 磁盘缓存是将数据存储在用户的磁盘当中,相比内存缓存,磁盘缓存容量更大,可存储更多资源,且数据不会因浏览器关闭而丢失,能长期保存,不过读取速度比较慢。常用于资源比较大,不常更新的资源。

浏览器缓存

除了客户端缓存以外,服务端自身也会进行缓存用于减轻服务端的压力。服务端缓存可以分为服务器本地缓存和内容分发网络缓存(CDN)。

服务器本地缓存:服务器可在本地设置缓存机制,将频繁访问的数据或资源存储在内存(如使用 Redis 等内存数据库)或磁盘中。当接收到相同请求时,直接从本地缓存返回结果,减少数据库查询或文件读取的开销。

内容分发网络(CDN):CDN 是一种分布式的缓存系统,由分布在全球各地的边缘节点服务器组成。当用户请求资源时,CDN 会将请求分配到离用户最近的节点,该节点若缓存了对应资源,就直接返回给用户,大大缩短了网络传输距离,提升加载速度。

结语

HTTP 缓存是 Web 性能优化的 “基石”,看似简单却暗藏玄机。掌握这些面试常考点:

  • 强缓存和协商缓存的区别与配合
  • 常见缓存标识的作用
  • 缓存位置与适用场景

理解这些逻辑后,面试问到的时候就不会再手足无措了。

image.png

创作不易 礼貌集赞