I. 介绍浏览器缓存的作用
提高网页加载速度
在打开一个网页时,浏览器会向服务器请求页面资源,如图片、文本等,这个过程需要一定的时间。而浏览器缓存可以帮助提升网页的加载速度,因为浏览器缓存可以将已经请求过的资源保存在本地
,每次请求时无需再次从服务器获取,这样就可以减少网页的加载时间。
当访问同一个网站时,这个功能尤其有用。因为浏览器缓存可以保留用户之前访问过的网页的静态文件。比如,如果您曾经访问过一个网站,并且该网站的 logo 文件已经在您的本地计算机上保存了,每当您再次访问这个网站时,浏览器将直接从本地读取该文件,而无需再向服务器发出请求。这样就可以显著加快网页加载速度,提供更好的用户体验。
此外,浏览器缓存还可以通过控制缓存的有效期来更新文件。例如,当网站更新了 .css 文件时,您可以设置浏览器缓存的有效期,以确保客户端在一段时间内缓存的是旧版本的文件。一旦有效期过期,浏览器会再次从服务器获取新的文件,保证您能够访问最新的网页内容。
减少网络带宽消耗
当在浏览网页时,每次请求所需要的数据量都将通过网络传输。如果您没有使用浏览器缓存功能,每次访问网页都需要从服务器获取相同的文件,这将消耗大量的网络带宽,尤其是在访问相同的网站时。但是,当您使用浏览器缓存功能时,它能够将静态文件(例如图片、音频、CSS、JS
等)保存在本地,这些数据不再需要通过网络传输,从而可以大大减少网络带宽的消耗。
此外,浏览器缓存还可以通过减少 HTTP 请求来降低带宽消耗。比如,在本地缓存了某个页面的资源后,再次访问该网站时,浏览器会直接使用本地资源,而无需向服务器发送请求,这样就可以减少需要通过网络传输的数据量。通过减少 HTTP 请求,可以大大降低网站的带宽消耗,从而减少服务器的负载。
因此,浏览器缓存功能可以在减少网络带宽消耗方面发挥重要作用,从而提高网站的性能和用户体验。
优化用户体验
浏览器缓存可以大大提高网站的速度,并且对用户体验有非常重要的影响。
以下是一些使用浏览器缓存来优化用户体验的方法:
- 设置合理的缓存时间:对于经常更新的资源,如网站的首页和常规内容,可以设置较短的过期时间,对于不太容易发生变化的资源(如
logo、多媒体
等),可以设置较长的过期时间。 - 压缩文件:对于静态文件(如
CSS、JS、HTML
等),通过压缩文件来减少文件大小可以显著提高网站的加载速度,同时还可以降低网络带宽的消耗。 - 加载必要的资源:只加载必要的资源,减少无效的
HTTP
请求,可以显著提高页面的加载速度。 - 减少重定向:为了避免多余的
HTTP
请求,在配置网站时请减少重定向。重定向会消耗额外的时间,从而降低网站的性能。 - 优化缓存策略:可以通过配置缓存策略来保证浏览器缓存的一致性,以确保用户在访问网站时获得最佳的用户体验。
通过合理地使用浏览器缓存功能,可以改善用户体验,提高网站的性能和可用性。
II. 浏览器缓存的原理
缓存机制
浏览器缓存机制是指浏览器将已经访问过的资源(如图片、JS、CSS等)保存在本地计算机上,下次请求同样的资源时可以直接从本地计算机加载,而不必再通过网络请求。这可以减少页面加载时间和带宽占用,提高用户体验和性能。
浏览器缓存机制通常分为两种类型:expires 与 Cache-Control。
- “Expires” 是
HTTP/1.0
的产物,在文件在本地缓存的过期时间。当客户端请求该文件且发现文件在本地缓存尚未失效时,则不会发起访问,直接从缓存提取使用。该字段的缺点是由于本地缓存时间的设置是由服务端发起的,因此如果服务端时间和客户端时间存在一定的偏差时,可能会导致缓存的失效时间不准确。 - “Cache-Control” 是
HTTP/1.1
中对 “Expires
” 做出了改进和优化,通过控制 HTTP 的缓存行为可以更加灵活地设置响应头信息,包括指令例如no-cache、no-store、public、max-age
等。其中no-cache
代表每次请求都需要跟服务器通信,而不使用本地缓存;no-store
则表示所有内容都不可存储在本地缓存;public
则表示文件可以被任意缓存,而私有缓存的指令则只针对某个客户端有效等。
除了上述两种缓存机制外,还有一些其他的机制可以进行缓存,例如 Etag 或者 Last-modified,这些技术通常被用于静态资源的更新检测,可以帮助开发者跟踪和检测静态资源的更新情况。
缓存分类
1. 强缓存
强缓存是浏览器缓存的一种机制,也叫 HTTP 的 Expires 和 Cache-Control 。
强缓存的原理就是在客户端请求服务器时,服务器在 HTTP 返回报文中携带了一个缓存标识字段"Cache-Control"和"Expires" 作为缓存策略。当浏览器再次请求该资源时,先检查当前时间是否在缓存有效期内,如果在有效期内,直接从本地缓存获取资源,不发送请求至服务器,以此来缓解服务器性能压力和网络带宽消耗。
具体来说,“Cache-Control” 是 HTTP/1.1 中的规范,主要有如下指令:
public
:表示该文件可以被任意缓存,适用于多用户终端共享同一个缓存的情况;private
:表示该文件只能被私有缓存所缓存,不能在用户之间共享缓存,因此适用于单用户终端或是个别用户所用终端缓存的情况;no-cache
:表示该文件必须从服务器中获取最新的版本,并提交缓存验证请求;max-age
:表示该文件会在 n 秒后过期,需要重新请求新的文件版本。
Expires 表示缓存的过期时间,也就是在这个时间点之前,浏览器可以直接从本地缓存中获取资源,而无需发送请求至服务器。在 HTTP/1.1 中,为了避免缓存时间准确性的问题,多使用 Cache-Control 进行缓存的控制。
总之,强缓存机制通过在响应头中添加缓存策略,告知浏览器可以直接从本地缓存中读取该资源,避免了重复请求和传输数据,提高了网站的性能和效率。
2. 协商缓存
协商缓存是指在浏览器缓存期间过期之后,客户端会向服务器发起一个请求,在请求头中携带上一次成功获取资源时的响应头信息(如 Etag
或者 Last-modified
),通过与服务器进行比对,以决定是否直接使用本地的缓存数据。如果本地资源有更新,则服务器会返回更新后的资源;如果本地资源没有更新,则服务器会返回一个带有 304 状态码的响应,告诉浏览器继续使用本地缓存。
协商缓存主要涉及到两个 HTTP 头信息:
ETag
:ETag
是服务器根据资源内容(即资源的各种参数,如文件名、大小等)生成的一个唯一标识符,当资源发生变化时,ETag
的值也会发生改变。- Last-Modified:
Last-Modified
响应头中包含的是资源上一次修改的日期,也就是服务器端文件最后修改的时间。
在接收到客户端发来的资源请求后,服务端可以通过判断请求中的 ETag
或 Last-modified
字段中的值是否与服务端最新的版本一致来决定是返回一个响应体,还是直接返回 304 状态码来告诉客户端可以直接使用本地缓存。
协商缓存机制可以有效减少不必要的数据传输,提高网站的性能和效率,同时也可以节省服务器带宽开销。
III. 强缓存
缓存操作流程
浏览器使用缓存的操作流程大致如下:
- 首先浏览器检查当前的请求是否命中强缓存,如果已经过期或者没有命中强缓存,则发起请求给服务器。
- 服务器处理请求,根据请求头中的信息判断其是否命中协商缓存,若资源未发生更新,则直接返回 304 状态码,否则返回新的资源内容。
- 浏览器接收到服务器的响应,根据响应头信息来更新或者创建本地缓存。如果响应中的缓存策略是
max-age
或Expires
,则浏览器会在规定的时间之内直接使用本地缓存,否则会根据协商缓存的策略来判断是否命中缓存,然后更新或者创建本地缓存。 - 在后续的请求中,如果浏览器命中了缓存,则可以直接从本地缓存中获取资源,而省略掉了网络请求的时间和流量,提高了网站的性能和效率。
需要注意的是:缓存的使用需要在保证资源内容更新及时的同时,尽量使用缓存避免重复请求,从而提高网站的性能和速度。因此,在设计网站缓存控制时需要权衡可缓存的内容是否真实有效,以及最大可接受的缓存过期时间,以达到缓存优化的最佳效果。
缓存过期机制
缓存过期机制是指在响应中告知客户端,缓存在何时过期失效的机制。浏览器缓存有两种过期机制:强制缓存和协商缓存。
1. 强制缓存过期机制
强制缓存是通过响应头中的 Cache-Control
或 Expires
字段来控制的。Cache-Control 包含许多不同的指令,最常见的是 max-age 指令,该指令规定了自从请求完成后多长时间后,浏览器强制转向服务器。
例如,Cache-Control: max-age=3600
表示资源将在一个小时后过期,而在过期之前,浏览器将一直使用它的本地缓存。另一个常见的指令是 no-cache,它将在每次请求时强制重新验证资源,从而防止浏览器缓存内容。
Expires 字段是在 HTTP/1.0 中引入的一种过期机制,它不太灵活,因为它基于一个固定的过期时间。如果响应中包含了 Expires 字段,则表示资源在这个时间之前不会过期。
2. 协商缓存过期机制
协商缓存过期机制是在强制缓存过期后使用的。当资源过期时,它将发送一个 HTTP 请求到服务器,询问资源是否已经更新。服务器将在响应头中添加 Etag
或 Last-Modified
信息。Etag 是资源的唯一标识符,当资源更新时,Etag
也随之更新。Last-Modified
属性表示资源的最后修改时间。
浏览器在下一次请求时会将 Etag 或 Last-Modified 与服务器的相应值进行比较。如果发现它们是相同的,那么就没有必要重新下载该资源,浏览器可以继续使用本地缓存。
总之,正确地设置缓存过期时间可以大大提高网站的性能和效率,促进站点流量变现。同时,建议在设置缓存策略时,需要考虑具体的业务场景和需求以及资源的更新频率,以达到最好的缓存效果。
如何设置强缓存
设置强制缓存可以通过设置 HTTP
响应头 Cache-Control
或 Expires
来实现。
1. Cache-Control
Cache-Control 是 HTTP/1.1 中最常用的缓存控制头。它提供了对缓存机制的更细粒度控制。它可以通过在响应头中添加 Cache-Control 字段来控制浏览器的行为。
具体的 Cache-Control 值可分为两种类型:指令(directives)和值(values)。
常用的指令和值如下:
- public: 表示响应可以被客户端和代理服务器缓存。示例:Cache-Control: public。
- private: 表示响应只能被客户端缓存,中间代理服务器不能缓存。示例:Cache-Control: private。
- no-cache: 表示缓存服务器需要把请求转发给源头服务器,以便重新验证资源是否更新。示例:Cache-Control: no-cache。
- max-age: 表示资源能够被缓存的最长时间,单位秒。示例:Cache-Control: max-age=31536000。
2. Expires
Expires 是 HTTP/1.0 中设置缓存过期时间的做法。它通过在响应头中添加 Expires 字段来控制浏览器缓存。它是一个以 GMT 为标准的时间戳,表示资源的过期时间。如果超过这个时间,缓存将被认为是无效的,并且浏览器会执行新的 HTTP 请求。
示例:Expires: Wed, 19 Oct 2033 16:00:00 GMT。
需要注意的是,Cache-Control 指令的优先级更高,当 Cache-Control 和 Expires 都存在时,Cache-Control 会被优先考虑使用。
因此,在设置缓存策略时,应该选择合适的 Cache-Control 值,以实现更细粒度的控制,并考虑资源的更新频率等因素,来决定缓存时间的有效期。
IV. 协商缓存
304 Not Modified状态码
304 Not Modified 状态码是 HTTP 协议中的一种响应状态码,表示请求的资源未发生修改,可以直接使用客户端已经缓存的数据,从而节省带宽和加快响应速度。
当客户端请求 HTTP 资源时,它会提交一些头文件,以帮助服务器决定客户端是否需要更新它的缓存。服务器会比较客户端提交的头文件与最新版本的资源文件中的头文件,如果它们匹配,则服务器会将 HTTP 状态码设置为 304 Not Modified,否则服务器将为客户端提供最新版本的资产内容。
返回 304 状态码时,服务器不会返回响应体,只返回响应头部,告诉客户端直接使用本地缓存即可。这样可以减少网络流量,从而提高网站的性能和速度。
需要特别注意的是,如果服务器未设置有效的缓存控制头字段(如 ETag 或 Last-Modified),则服务器将无法检测到资源是否已经修改,也不会返回 304 状态码。此时,客户端每次请求该资源,都会重新下载并获取最新的资源。因此,建议在开发中务必设定合适的缓存策略和控制头,以最大程度地利用缓存,提高资源的效率和性能。
缓存操作流程
协商缓存是 HTTP 协议中的一种缓存机制,可以通过判断客户端和服务器端提供的缓存标识(如 ETag 或 Last-Modified),来验证资源是否更新,进而决定是否使用缓存。其操作流程如下:
1. 客户端第一次请求资源
客户端请求资源时,如果服务器端响应头中没有设置 Cache-Control、Expires
或者它们的值已过期,那么客户端缓存失效,需要重新向服务器请求资源。
2. 服务器返回资源和缓存标识
服务器成功向客户端返回资源同时还返回了资源的缓存标识(ETag 或 Last-Modified),这些标识可以帮助客户端判断资源是否有更新。
3. 客户端再次请求资源,并带上缓存标识
客户端再次请求资源时,会在请求头中添加“ETag”或“Last-Modified”等缓存标识,告诉服务器需要使用协商缓存机制来获取数据。
4. 服务器检查缓存标识和资源是否一致
服务器接到客户端的请求后,会检查请求头中的缓存标识与服务器端资源的标识是否一致。
若标识一致,则返回 304 Not Modified 状态码,告诉客户端可以使用缓存。
若标识不一致,则直接返回新的资源内容和更新后的缓存标识。
5. 客户端使用缓存
客户端收到响应后,根据响应码来决定是否使用客户端本地缓存。
如果响应码为 304,则表示资源未更新,可以直接使用本地缓存。
如果响应码为 200,则表示资源已更新,客户端应该使用新的资源内容。
协商缓存机制可以减少无谓的请求,从而有效提高网站的性能和速度,建议在开发中准确设置缓存控制头,以达到最佳的缓存效果。
从此告别网速慢,轻松掌握浏览器缓存知识点!(二)https://developer.aliyun.com/article/1426401