Last Updated on 2024-08-05 by likun.gong

最近一直在搞 CDN 相关的东西,碰到最多的便是缓存了,简单记录一下相应的内容。

缓存是什么

客户端浏览器访问网页时,需要从服务端拉取到相应的资源,但是有的客户端离服务端可能会很远,访问的时候会直观感受到 ,缓存就是用来解决这一问题的。

缓存有哪些:

  1. 本地缓存。浏览器会根据请求头的策略,将数据缓存在内存或者磁盘中
  2. CDN。Content Delivery Network,将资源先存放在离用户近的地方,这样用户访问的链路更短,访问的时候便可以加速,同时 CDN 访问服务端源站也会有相应的加成(CDN提供商的网络比客户本地的网络会更可靠)

如何控制缓存

浏览器如何确定我能否缓存这个资源呢?

它是通过 http Response 中的 Cache-Control 请求头来决定的。

缓存行为:

  • public :表明响应可以被任何对象(包括:发送请求的客户端,代理服务器,等等)缓存
  • private :表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它)
  • no-cache :在发布缓存副本之前,强制要求缓存把请求提交给原始服务器进行验证 (协商缓存验证)
  • no-store :不使用任何缓存

缓存时间:

  • max-age=<seconds>
    设置缓存存储的最大周期,超过这个时间缓存被认为过期 (单位秒),时间是相对于请求的时间。

目前接触比较多的参数主要是上述这些,更多的参数可以参照 MDN文档。除了
Cache-Control 头之外,http 中还会通过 Etag 请求头作为资源的唯一标签。

在缓存到期之后,再请求资源,客户端会通过 If-None-Match 带上 Etag 的内容,发送给服务端,服务端判断资源是否发生变化,未发生变化,则返回 304 Not Modified,这样就无需再传输完整的资源,节省了带宽。

浏览器如何判断缓存过期了呢?

服务端响应的头中,除了 Cache-Control ,还有一个 Date 的头,记录请求的时间,这样便可以根据 Date + max-age 的秒数,拿到缓存的到期时间,再次请求资源时,缓存有效则直接使用缓存的资源。

如何判断命中了 CDN 的缓存?

命中 CDN 缓存之后,一般在 Response header 中都会有相关的响应头

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注