专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

2021年技术梳理篇《HTTP缓存》

ins518 2024-09-21 00:32:45 技术文章 26 ℃ 0 评论

Hi,我们又见面了,我是小鑫同学1024,今天带来了2021年技术梳理篇《HTTP缓存》

在Chrome调试模式关闭Network中的Disable cache

强缓存-HTTP1.0

访问本地缓存验证资源是否有效

状态码: 200

expires: 服务器响应请求的资源时在Response Headers中增加expires字段标明资源过期时间(格林尼治时间)

缺点: 服务器和客户端时间不同步造成影响

// 请求资源10秒内有效 key:Expires value:格林尼治时间
res.setHeader("Expires", new Date(Date.now() + 10 * 1000).toUTCString());

强缓存-HTTP1.1

访问本地缓存验证资源是否有效

有效单位(秒)

状态码: 200

cache-control: 服务器响应请求的资源时在Response Headers中增加cache-control字段标明资源缓存形式

Cache-directive

说明

public

所有内容都将被缓存(客户端和代理服务器都可以缓存)

private

内容置换成到私有缓存中(客户端可以缓存)

no-cache

需要使用协商缓存来验证缓存数据

no-store

所有内容都不会缓存

must-revalidation/proxy-revalidation

如果缓存的内容失效,请求必须发送到服务器/代理以进行重新验证

max-age=xxx(xxx is numeric)

缓存的内容将在xxx秒后失效,这个选项只在HTTP1.1可用,并如果和Last-Modified一起使用时,优先级较高

示例: 资源缓存5秒有效

res.setHeader("Cache-Control", "max-age=5");

协商缓存: last-modified & if-modified-since: 基于时间

设置no-cache/no-store会忽略本地缓存,请求服务器验证资源是否有效

状态码: 304

示例: 资源缓存5秒有效

res.setHeader("Cache-Control", "no-cache");
res.setHeader("last-modified", new Date().toUTCString());
if (new Date(req.headers["if-modified-since"]).getTime() + 5 * 1000 > Date.now()) {
  res.statusCode = 304;
  res.end();
} else {
  res.statusCode = 200;
  res.end(content);
}

协商缓存: Etag & if-none-match: 基于内容摘要

设置no-cache/no-store会忽略本地缓存,请求服务器验证资源是否有效

状态码: 304

示例: 资源缓存5秒内容不修改有效

res.setHeader("Cache-Control", "no-cache");
const crypto = require("crypto");
const hash = crypto.createHash("sha1").update(content).digest("hex");
res.setHeader("Etag", hash);
  if (req.headers["if-none-match"] === hash) {
  res.statusCode = 304;
  res.end();
} else {
  res.statusCode = 200;
  res.end(content);
}

本篇内容到此就结束了,感谢你的阅读,我是小鑫同学1024,一个5年滴,Bug,来者不拒,断点打起来,3年Android开发,2年+Vue前端开发,混合App开发的程序员,如果文章对你有所帮助,希望可以动动你的小手[赞]、[666]、[来看我],我们下篇文章见[灵光一闪]~

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表