http缓存策略 | 青训营

56 阅读3分钟

我选择Google Chrome浏览器来进行HTTP的缓存策略的具体分析。在HTTP请求中,常见的缓存策略包括强缓存和协商缓存。

  1. 强缓存: 强缓存是通过设置HTTP响应头来实现的。常见的设置有两种方式:

    • Expires:通过设置一个过期时间,在这个时间之前,浏览器可以直接从缓存中获取数据,而不会再向服务器发送请求。服务器返回的响应头中会包含一个Expires字段,其值为一个具体的过期时间。

    • Cache-Control:通过设置Cache-Control字段来控制缓存策略。常见的Cache-Control的值有:

      • public:表示响应可以被任何缓存(包括CDN)缓存。
      • private:表示响应只能被浏览器缓存,不应该被CDN等网络中间节点缓存。
      • no-cache:浏览器会进行协商缓存验证,即发送一个带有If-Modified-Since字段的请求到服务器,如果服务器返回304 Not Modified,则表示可以使用缓存。
      • no-store:禁止缓存,每次请求都会向服务器发送请求。

具体示例代码如下,展示了如何使用Expires和Cache-Control来实现强缓存:

javascriptCopy code
// 设置过期时间为10分钟
response.setHeader("Expires", new Date(Date.now() + 10 * 60 * 1000).toUTCString());

// 设置Cache-Control为public,缓存有效期为10分钟
response.setHeader("Cache-Control", "public, max-age=600");
  1. 协商缓存: 协商缓存是指浏览器向服务器发送请求时,通过对比资源的标识来判断资源是否需要更新。常见的协商缓存策略有两种:

    • Last-Modified/If-Modified-Since:服务器在响应头中返回资源的最后修改时间(Last-Modified),而浏览器在下一次请求时,通过设置If-Modified-Since字段来将最后修改时间发送给服务器。服务器会将资源的最后修改时间与If-Modified-Since字段进行比较,如果相同,则返回304 Not Modified,表示资源没有发生更新,可以使用缓存。
    • ETag/If-None-Match:服务器在响应头中返回一个唯一标识符(ETag),而浏览器在下一次请求时,通过设置If-None-Match字段将该标识符发送给服务器。服务器会将资源的标识符与If-None-Match字段进行比较,如果相同,则返回304 Not Modified,表示资源没有发生更新,可以使用缓存。

具体示例代码如下,展示了如何使用Last-Modified/If-Modified-Since和ETag/If-None-Match来实现协商缓存:

javascriptCopy code
// 设置最后修改时间为资源的修改时间
response.setHeader("Last-Modified", new Date(resource.lastModified).toUTCString());

// 判断If-Modified-Since字段与最后修改时间的比较
if (request.headers["if-modified-since"] === new Date(resource.lastModified).toUTCString()) {
    // 返回304 Not Modified表示可以使用缓存
    response.statusCode = 304;
    response.end();
}

// 设置ETag为资源的唯一标识符
response.setHeader("ETag", generateETag(resource));

// 判断If-None-Match字段与ETag的比较
if (request.headers["if-none-match"] === generateETag(resource)) {
    // 返回304 Not Modified表示可以使用缓存
    response.statusCode = 304;
    response.end();
}

// 生成资源的唯一标识符
function generateETag(resource) {
    // 根据资源的内容生成唯一标识符
    // 可以使用哈希算法如MD5等
    // 返回生成的唯一标识符
}

综上所述,通过设置HTTP响应头的缓存相关字段,可以实现浏览器的缓存策略。强缓存通过设置过期时间或Cache-Control来指定缓存的有效期,而协商缓存通过比较资源的标识来判断资源是否需要更新。合理使用缓存策略可以减少对服务器的请求,提高网页加载速度和用户体验。