HTTP之强缓存和协商缓存

简介: HTTP之强缓存和协商缓存

image.png


关于强缓存和协商缓存的理论知识和express.js下的实践,政采云前端团队的这篇文章已经非常详尽了:图解 HTTP 缓存


强缓存和协商缓存流程图


图来自图解 HTTP 缓存


刚好我最近也在对这一块的内容做补充和总结,受到这篇优质博文的启发,于是有了这篇博文。


那么在这篇博文中会看到什么呢?

  • 强缓存和协商缓存需要注意的细节
  • HTTP 强缓存和协商缓存之 Koa 实战
  • Expires,Cache-Control, Pragma
  • If-Modified-Since&&Last-Modified
  • If-None-Match&&ETag


强缓存和协商缓存需要注意的细节


报文头类型

报文头 请求头 响应头
Expires
Pragma
Cache-Control
If-Match/If-None-Match
ETag
If-Modified-Since
Last-Modified


报文头优先级


强缓存:Pragma > Cache-Control > Expires

协商缓存:If-None-Match/ETag > If-Modified-Since/Last Modified

如果强缓存是新鲜的,优先强缓存。


如果强缓存是不新鲜的,判断有无协商缓存:


若上一次请求中有ETag,在If-None-Match带上ETag value;
若上一次请求中没有ETag,判断上一次请求响应中是否有Last-Modified,在If-Modified-Since中带上Last-Modified value;


若资源没有更新,状态码为304走浏览器缓存;若为200,走协商缓存,返回更新后的资源。


HTTP 强缓存和协商缓存之 Koa 实战


Expires

代码:

const Koa = require("koa");
const app = new Koa();
app.use((ctx) => {
  ctx.body = "HTTP强缓存之Expires";
  ctx.set("Expires", "Mon, May 11 2020 22:10:14 GMT");
});
app.listen(3000);
console.log("应用运行在localhost:3000");

首次请求:



第二次请求来自强缓存:



Cache-Control


代码:


const Koa = require("koa");
const app = new Koa();
app.use((ctx) => {
  ctx.body = "HTTP强缓存之Cache-Control";
  ctx.set("Cache-Control", "public,max-age=60");
});
app.listen(3000);
console.log("应用运行在localhost:3000");


首次请求:



第二次请求来自强缓存:



Pragma


代码:

const Koa = require("koa");
const app = new Koa();
app.use((ctx) => {
  ctx.body = "HTTP强缓存之Pragma";
  ctx.set("Pragma", "no-cache");
});
app.listen(3000);
console.log("应用运行在localhost:3000");


首次请求:

Pragma


第二次请求:


If-Modified-Since&&Last-Modified

代码:

const Koa = require("koa");
const app = new Koa();
app.use((ctx) => {
  ctx.body = "HTTP协商缓存之If-Modified-Since&&Last-Modified";
  ctx.set({
    "Last-Modified": "Mon, May 11 2020 22:20:14 GMT",
  });
});
app.listen(3000);
console.log("应用运行在localhost:3000");


第一次请求:

网络异常,图片无法展示
|

第二次请求:

网络异常,图片无法展示
|

If-None-Match&&ETag


代码:

const conditional = require("koa-conditional-get");
const etag = require("koa-etag");
const Koa = require("koa");
const app = new Koa();
app.use(conditional());
app.use(etag());
app.use((ctx) => {
  ctx.body = "HTTP协商缓存之If-None-Match&&ETag";
});
app.listen(3000);
console.log("应用运行在localhost:3000");


首次请求:

网络异常,图片无法展示
|

第二次请求来自协商缓存:

相关文章
|
2月前
|
缓存 UED
强缓存与协商缓存
强缓存与协商缓存
120 62
|
3月前
|
缓存 JSON 前端开发
超详细讲解:http强缓存和协商缓存
超详细讲解:http强缓存和协商缓存
|
23天前
|
存储 缓存 NoSQL
保持HTTP会话状态:缓存策略与实践
保持HTTP会话状态:缓存策略与实践
|
1月前
|
存储 缓存 监控
HTTP:强缓存优化实践
HTTP强缓存是提升网站性能的关键技术之一。通过精心设计缓存策略,不仅可以显著减少网络延迟,还能降低服务器负载,提升用户体验。实施上述最佳实践,结合持续的监控与调整,能够确保缓存机制高效且稳定地服务于网站性能优化目标。
45 3
|
2月前
|
缓存 监控
如何解决协商缓存中资源更新不及时的问题?
如何解决协商缓存中资源更新不及时的问题?
|
2月前
|
缓存 UED
强缓存和协商缓存的优缺点分别是什么?
强缓存和协商缓存的优缺点分别是什么?
|
2月前
|
缓存 JSON 前端开发
你知道304吗?图解强缓存和协商缓存
该文章深入解析了HTTP协议中的缓存机制,重点讲述了强缓存和协商缓存的工作原理,并解释了HTTP状态码304的意义及其对前端和后端的影响。
|
4月前
|
缓存 JSON 算法
http【详解】状态码,方法,接口设计 —— RestfuI API,头部 —— headers,缓存
http【详解】状态码,方法,接口设计 —— RestfuI API,头部 —— headers,缓存
65 0
|
1月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
74 6
|
6天前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题