本文参考:什么是强缓存和协商缓存?以及他们的区别?-阿里云开发者社区
ChatGPT 仅用于自用复习
强缓存和协商缓存是浏览器缓存机制中的两种主要方式,目的是减少对服务器的请求,提高页面加载速度。它们的核心区别在于是否需要向服务器确认资源是否可以使用缓存。

1. 强缓存 (Strong Cache)
定义:
强缓存是指当浏览器请求一个资源时,如果本地缓存中有这个资源且仍然有效,则直接使用缓存,不发送请求到服务器。
实现方式:
通过 HTTP 响应头中的 Cache-Control 或 Expires 字段控制:
Cache-Control: 是 HTTP/1.1 提供的字段,用于指定缓存策略。
示例:Cache-Control: max-age=3600 表示资源在 3600 秒内有效。
cache-control除了该字段外,还有下面几个比较常用的设置值:
-no-cache:不使用本地缓存。需要使用缓存协商,先与服务器确认返回的响应是否被更改,如果之前的响应中存在ETag,那么请求的时候会与服务端验证,如果资源未被更改,则可以避免重新下载。
-no-store:直接禁止浏览器缓存数据,每次用户请求该资源,都会向服务器发送一个请求,每次都会下载完整的资源。
-public:可以被所有的用户缓存,包括终端用户和CDN等中间代理服务器。
-private:只能被终端用户的浏览器缓存,不允许CDN等中继缓存服务器对其缓存。
Expires: 是 HTTP/1.0 的字段,指定资源过期的具体时间(绝对时间)。
示例:Expires: Wed, 18 Jan 2025 12:00:00 GMT
特点:
如果强缓存有效,浏览器直接从缓存中读取资源。
不会向服务器发送请求。
2. 协商缓存 (Conditional Request)
定义:
协商缓存是指当浏览器请求一个资源时,先向服务器发送一个条件请求,确认本地缓存的资源是否仍然有效。如果资源未更改,服务器返回 304 Not Modified,浏览器继续使用缓存资源。
实现方式:
通过 HTTP 响应头中的 ETag 或 Last-Modified 与请求头中的 If-None-Match 或 If-Modified-Since 配合使用:
ETag: 是资源的唯一标识符,资源改变时 ETag 会更新。
浏览器请求时使用 If-None-Match 携带上次的 ETag。
Last-Modified: 表示资源最后修改的时间。
浏览器请求时使用 If-Modified-Since 携带上次的 Last-Modified 值。
ETag和Last-Modified的作用和用法,他们的区别:
1在精度上,.Etag要优于Last-Modified。Last-Modified的时间单位是秒,如果某个文件在1秒内改变了多次,那么他们的Last-Modified其实并没有体现出来修改,但是Etag每次都会改变确保了精度;
2.在性能上,Etag要逊于Last-Modified,毕竟Last-Modified只需要记录时间,而Etag需要服务器通过算法来计算出一个hash值;
3.在优先级上,服务器校验优先考虑Etag。
特点:
浏览器向服务器发送请求,附带条件字段(If-None-Match 或 If-Modified-Since)。
服务器根据条件字段判断:
如果资源未更改,返回 304 Not Modified,并且浏览器使用缓存。
如果资源已更改,返回新的资源和状态码 200 OK。
| 特性 | 强缓存 | 协商缓存 |
| 是否请求服务器 | 不会发起请求 | 会发起条件请求 |
| 控制字段 | Cache-Control / Expires | ETag / Last-Modified |
| 响应状态码 | 无请求,直接使用缓存 | 304 (未修改) 或 200 (已更新) |
| 适用场景 | 资源未过期,直接可用 | 资源可能已过期,需确认是否更新 |
2553

被折叠的 条评论
为什么被折叠?



