前言
不知道各位有没有在面试中被拷打HTTP缓存策略的经历,那到底什么是HTTP缓存? HTTP缓存具体有什么作用? HTTP缓存的策略是什么? 今天我们就来简单了解一下HTTP缓存
HTTP简介
HTTP缓存是一种在客户端或服务端临时存储资源(HTML,CSS,JS文件,图片等)的机制。每当浏览器请求相同资源的时候,不是直接从服务端获取,而是看本地有没有相同请求,如果有就直接从本地获取。如果资源更新,那下次请求时则从服务端获取并保存到本地。
这样做的好处有:
- 减少请求次数,减轻服务端压力;
- 减少网页响应时间,增加用户体验;
- 减少网络带宽,减少用户流量消耗;
HTTP缓存流程
- 浏览器向服务端发送请求
- 服务端收到浏览器发送过来的请求,返回资源,并在响应头加上对应的缓存标识
- 浏览器接收到响应,根据响应报文中缓存标识(如Cache-Control,Etag,Last-Modified 与 If-Modified-Since等)做出对应的缓存策略
- 浏览器下次发送同样的请求,先在本地查找有没有对应的缓存,如果有直接返回结果
为了更加直白的演示,我们可以看一下简单的流程图:
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状态,重新返回资源,浏览器会将收到的资源重新缓存到本地。
协商缓存主要依靠 ETag 和 Last-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缓存资源的位置主要分为客户端缓存和服务端缓存。
客户端缓存
客户端缓存可以分为内存缓存和磁盘缓存。
- 内存缓存是位于浏览器运行时占用的内容空间中,是浏览器优先使用的缓存区域。其特点是读写速度特别快,适用于需要快速响应的资源。
- 磁盘缓存是将数据存储在用户的磁盘当中,相比内存缓存,磁盘缓存容量更大,可存储更多资源,且数据不会因浏览器关闭而丢失,能长期保存,不过读取速度比较慢。常用于资源比较大,不常更新的资源。
浏览器缓存
除了客户端缓存以外,服务端自身也会进行缓存用于减轻服务端的压力。服务端缓存可以分为服务器本地缓存和内容分发网络缓存(CDN)。
服务器本地缓存:服务器可在本地设置缓存机制,将频繁访问的数据或资源存储在内存(如使用 Redis 等内存数据库)或磁盘中。当接收到相同请求时,直接从本地缓存返回结果,减少数据库查询或文件读取的开销。
内容分发网络(CDN):CDN 是一种分布式的缓存系统,由分布在全球各地的边缘节点服务器组成。当用户请求资源时,CDN 会将请求分配到离用户最近的节点,该节点若缓存了对应资源,就直接返回给用户,大大缩短了网络传输距离,提升加载速度。
结语
HTTP 缓存是 Web 性能优化的 “基石”,看似简单却暗藏玄机。掌握这些面试常考点:
- 强缓存和协商缓存的区别与配合
- 常见缓存标识的作用
- 缓存位置与适用场景
理解这些逻辑后,面试问到的时候就不会再手足无措了。
创作不易 礼貌集赞