强缓存和协商缓存

143 阅读3分钟

强缓存和协商缓存是Web开发中两种主要的缓存机制,用于提高网页加载速度,减少服务器负载。下面分别介绍这两种缓存机制:

  1. 强缓存

    • 强缓存通过设置HTTP响应头中的ExpiresCache-Control来控制。当浏览器请求资源时,服务器会在响应头中指定一个过期时间。
    • 如果资源在设定的时间内没有过期,那么浏览器会直接从本地缓存中读取资源,不会向服务器发送请求。
    • 使用Cache-ControlExpires更灵活,因为它不依赖于服务器时间。
  2. 协商缓存

    • 协商缓存通过ETagLast-ModifiedIf-None-MatchIf-Modified-Since配合使用来实现。
    • 当浏览器首次请求资源时,服务器会在响应头中返回资源的版本号(ETag)或最后修改时间(Last-Modified)。
    • 下次请求同一资源时,浏览器会在请求头中带上之前获取到的版本号或最后修改时间,服务器根据这些信息判断资源是否发生变化。
    • 如果资源未改变,服务器将返回304状态码而不是整个资源内容;如果资源已改变,则返回新的资源内容。

结合使用这两种缓存策略可以有效提升用户体验,同时减轻服务器压力。 配置强缓存和协商缓存主要是通过HTTP响应头来完成的。以下是具体的配置方法:

强缓存

强缓存通常使用Cache-ControlExpires来控制。Cache-Control是HTTP/1.1协议的一部分,而Expires是HTTP/1.0的特性,但在现代浏览器中仍然支持。

  • Cache-Control: 这个头字段可以设置多个指令,例如max-age定义了资源在多长时间内可以被缓存。示例配置如下:

    http
    Cache-Control: max-age=3600
    

    这表示资源可以在客户端缓存一个小时。

  • Expires: 这个头字段指定了一个绝对的时间点之后,资源将不再被认为是新鲜的。示例配置如下:

    http
    Expires: Thu, 01 Jan 2025 00:00:00 GMT
    

    这表示资源直到2025年的1月1日午夜前都是有效的。

协商缓存

协商缓存通常使用ETagLast-Modified来实现。

  • ETagETag是一个标识资源版本的唯一标识符。服务器返回一个ETag值给客户端,下次请求时客户端会发送一个If-None-Match头来验证资源是否已更改。示例配置如下:

    http
    ETag: "123456789abcdef"
    

    客户端再次请求时:

    http
    If-None-Match: "123456789abcdef"
    
  • Last-ModifiedLast-Modified指示资源最后一次被修改的时间。客户端在再次请求资源时会发送一个If-Modified-Since头来检查资源是否自上次请求后被修改。示例配置如下:

    http
    Last-Modified: Tue, 15 Nov 2022 12:45:26 GMT
    

    客户端再次请求时:

    http
    If-Modified-Since: Tue, 15 Nov 2022 12:45:26 GMT
    

实际应用中的配置

在实际的应用中,你可以使用服务器配置文件或者编程语言中的HTTP库来设置这些头部。例如,在Node.js中使用Express框架,你可以这样设置:

const express = require('express');
const app = express();
const ONE_HOUR = 3600 * 1000;

app.use((req, res, next) => {
  // 设置强缓存
  res.setHeader('Cache-Control', `public, max-age=${ONE_HOUR}`);
  
  // 设置协商缓存
  const etag = '123456789abcdef';
  res.setHeader('ETag', etag);

  next();
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

以上示例展示了如何在Express应用中设置强缓存和协商缓存。根据实际情况调整缓存时间和其他参数。