强缓存与协商缓存

强缓存与协商缓存

当浏览器请求资源时,可以使用强缓存和协商缓存来提高性能并减少网络请求。以下是它们的用途、用法和区别:

强缓存:

  • 用途:通过设置缓存标识来判断资源是否过期,如果资源仍然有效,则直接从缓存中获取,不发送请求到服务器。
  • 用法:服务器通过设置响应头中的缓存标识来实现强缓存,常见的缓存标识有:
    Cache-Control:指定缓存的控制策略,例如设置为max-age=3600表示资源在 3600 秒内有效。
    Expires:指定资源的过期时间,是一个绝对时间,例如Expires: Wed, 21 Oct 2022 07:28:00 GMT
    示例代码:
// 设置 Cache-Control
response.setHeader('Cache-Control', 'max-age=3600');

// 设置 Expires
response.setHeader('Expires', new Date(Date.now() + 3600000).toUTCString());

协商缓存:

  • 用途:通过与服务器进行通信,判断资源是否发生变化,如果未发生变化,则返回一个"304 Not Modified"的响应,告诉浏览器可以使用缓存。
  • 用法:服务器通过设置响应头中的缓存标识来实现协商缓存,常见的缓存标识有:
    Last-Modified:指定资源的最后修改时间。
    ETag:指定资源的唯一标识符,通常是根据资源内容生成的哈希值。
    示例代码:
// 设置 Last-Modified
response.setHeader('Last-Modified', new Date(lastModified).toUTCString());

// 设置 ETag
response.setHeader('ETag', generateETag(resource));

区别:

强缓存的优先级高于协商缓存,如果强缓存生效,浏览器直接从缓存中获取资源,不发送请求到服务器。
强缓存通过缓存标识判断资源是否过期,而协商缓存通过与服务器通信判断资源是否发生变化。
强缓存效率高,但判断精确度低;协商缓存效率相对较低,但判断精确度高。
请根据具体需求选择合适的缓存策略,以提高性能和用户体验。

应用配置

在日常使用中,只需要设置服务端的响应头来配置强缓存和协商缓存,一旦服务器配置了缓存策略,终端(例如浏览器)会自动根据服务器响应的缓存标识进行缓存控制。终端不需要额外的配置来使用缓存,它会自动处理缓存逻辑。

在Node.js中设置强缓存和协商缓存的配置如下:

  • 强缓存
app.get('/your-route', (req, res) => {
  // 设置 Cache-Control
  res.setHeader('Cache-Control', 'max-age=3600');
  
  // 设置 Expires
  res.setHeader('Expires', new Date(Date.now() + 3600000).toUTCString());
  
  // 返回响应
  res.send('Your response');
});
  • 协商缓存
app.get('/your-route', (req, res) => {
  // 获取资源的最后修改时间和 ETag
  const lastModified = new Date('your-last-modified-date');
  const eTag = 'your-generated-etag';
  
  // 设置 Last-Modified
  res.setHeader('Last-Modified', lastModified.toUTCString());
  
  // 设置 ETag
  res.setHeader('ETag', eTag);
  
  // 检查请求头中的 If-Modified-Since 和 If-None-Match
  const ifModifiedSince = req.headers['if-modified-since'];
  const ifNoneMatch = req.headers['if-none-match'];
  
  // 判断资源是否发生变化
  if (ifModifiedSince && ifNoneMatch) {
    if (new Date(ifModifiedSince) >= lastModified && ifNoneMatch === eTag) {
      // 返回 304 Not Modified
      res.status(304).end();
      return;
    }
  }
  
  // 返回响应
  res.send('Your response');
});


总结

最后用一个图总结缓存机制:

Created with Raphaël 2.3.0 发起请求 强缓存是否过期? 发送请求到服务器 缓存是否需要更新? 请求更新后的数据 返回更新后的数据,并重置缓存有效期 返回缓存结果,并重置缓存有效期 返回缓存结果 yes no yes no
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值