前端知识No.1:HTTP缓存

118 阅读3分钟

HTTP缓存

HTTP缓存分为两大类:强缓存协商缓存,这两种缓存都是通过HTTP响应头来控制的,目的是提高网站性能。

强缓存

强缓存分为内存缓存和硬盘缓存,强缓存后不需要再向服务器发送请求,而是从浏览器缓存读取。

● 内存缓存(memory cache):存储在浏览器内存中;
● 硬盘缓存(disk cache):存储在计算机硬盘中,空间大,但是读取效率比内存缓存低。

主要有两个响应头字段用于控制强缓存,其中 Cache-Control 是 HTTP/1.1 的标准,优先级更高;Expires 是 HTTP/1.0 的标准。

Expires

Expires:指定到期时间;判断机制:当客户端请求资源时,会获取本地时间戳,然后拿本地时间戳与Expires设置的时间做对比,如果本地时间戳小于Expires设置的时间走强缓存,否则对服务器发起请求。

Cache-Control

● max-age:浏览器资源缓存的时长(秒)
● no-cache:不走强缓存,走协商缓存
● no-store:禁止任何缓存策略
● public:资源可以被任何缓存(包括浏览器缓存或代理服务器缓存(CDN))缓存
● private:资源只能被私有缓存(浏览器缓存)缓存,不能共享缓存(如CDN)

注意: 如果max-age和Expires同时出现max-age优先级高。服务端不能控制强缓存的类型(内存缓存或硬盘缓存)。

协商缓存

强缓存优先于协商缓存,当资源的强缓存生效时,客户端可以直接从本地缓存中获取资源,无需与服务器进行通信。如果强缓存未命中(如max-age过期),则客户端会发起协商缓存的请求。在协商缓存中,客户端会发送带有缓存数据标识的请求头字段,以向服务器验证资源的有效性。

服务器会根据客户端发送的协商缓存字段(如If-Modified-SinceIf-None-Match)判断资源是否有变化。 如果资源未变化,服务器会返回304状态码(Not Modified),告诉客户端资源未改变可以使用本地缓存的资源。如果资源有变化,服务器会返回新的资源,状态码为200。

协商缓存Last-Modified

Last-Modified和If-Modified-Since:服务器通过Last-Modified响应头告知客户端资源的最后修改时间。 客户端在后续请求中通过If-Modified-Since请求头携带该时间,服务器判断资源是否有更新。如果没有更新返回304状态码。

ETag

ETag和If-None-Match:服务器通过ETag响应头给资源生成一个唯一标识符。客户端在后续请求中通过If-None-Match请求头携带该标识符,服务器根据标识符判断资源是否有更新,如果没有更新,返回304状态码。

注意: ETag 优先级比 Last-Modified 高

参考与引用:
juejin.cn/post/735207…