nodejs设置强制缓存,协商缓存

协商缓存(Conditional Requests)

协商缓存指的是浏览器每次请求时携带上次请求标识(如 Last-ModifiedETag),服务器通过这些标识判断资源是否修改,如果没有修改,则返回 304 Not Modified 响应。

  • Last-ModifiedIf-Modified-Since:基于资源的最后修改时间进行缓存协商。
  • ETagIf-None-Match:基于资源的内容哈希进行缓存协商。

适用场景:

  • 动态内容:如用户的个人信息页面,这些页面数据可能会经常更新,可以使用协商缓存来减少不必要的传输。
  • API 响应:特别是数据可能频繁变化的 API,可以使用协商缓存减少带宽消耗。

使用 Last-ModifiedIf-Modified-Since 

const http = require('http');
const fs = require('fs');
const path = require('path');const server = http.createServer((req, res) => {const filePath = path.join(__dirname, 'static', 'file.txt'); // 示例文件路径fs.stat(filePath, (err, stats) => {if (err) {res.statusCode = 404;res.end('File not found');return;}const lastModified = stats.mtime.toUTCString();// 检查 If-Modified-Since 头if (req.headers['if-modified-since'] === lastModified) {res.statusCode = 304; // Not Modifiedres.end();return;}res.setHeader('Last-Modified', lastModified);res.setHeader('Content-Type', 'text/plain');const fileStream = fs.createReadStream(filePath);fileStream.pipe(res);});
});server.listen(3000, () => {console.log('Server is running on http://localhost:3000');
});

 使用 ETagIf-None-Match

const http = require('http');
const fs = require('fs');
const path = require('path');
const crypto = require('crypto');const server = http.createServer((req, res) => {const filePath = path.join(__dirname, 'static', 'file.txt'); // 示例文件路径fs.readFile(filePath, (err, data) => {if (err) {res.statusCode = 404;res.end('File not found');return;}const hash = crypto.createHash('md5').update(data).digest('hex');const etag = `"${hash}"`;// 检查 If-None-Match 头if (req.headers['if-none-match'] === etag) {res.statusCode = 304; // Not Modifiedres.end();return;}res.setHeader('ETag', etag);res.setHeader('Content-Type', 'text/plain');res.end(data);});
});server.listen(3000, () => {console.log('Server is running on http://localhost:3000');
});

总结

  • Last-ModifiedIf-Modified-Since:基于资源的最后修改时间进行缓存协商。
  • ETagIf-None-Match:基于资源的内容哈希进行缓存协商。

强制缓存(Cache-Control)

强制缓存指的是服务器在响应头中设置缓存控制策略,告知浏览器在一定时间内不需要向服务器请求,直接使用本地缓存。常见的 Cache-Control 头值包括:

  • max-age=<seconds>:指定缓存的有效时间,单位是秒。
  • public:表示响应可以被任何缓存存储。
  • private:表示响应只能被用户的浏览器缓存,不能被共享缓存(如代理服务器)存储。
  • no-store:表示不缓存响应。
  • no-cache:表示缓存响应,但是每次使用缓存前必须向服务器验证。

适用场景:

  • 静态资源(如CSS、JS、图片):通常这些资源不会频繁变化,可以设置较长的 max-age
  • API 响应:根据业务需求设置,某些数据(如产品列表)可能每小时更新一次,可以设置适当的 max-age
  • 用户特定数据:如用户的购物车数据,适合 private
const http = require('http');
const fs = require('fs');
const path = require('path');http.createServer((req, res) => {const filePath = path.join(__dirname, 'public', req.url);fs.readFile(filePath, (err, data) => {if (err) {res.writeHead(404, { 'Content-Type': 'text/plain' });res.end('Not Found');return;}// 设置强制缓存,例如设置缓存一周const oneWeekInSeconds = 7 * 24 * 60 * 60;res.writeHead(200, {'Content-Type': 'text/html',// 在浏览器保存指定秒数后过期,优先于Expires'Cache-Control': `public, max-age=${oneWeekInSeconds}`,// 兼容旧版浏览器,超过指定日期后过期'Expires': new Date(Date.now() + oneWeekInSeconds * 1000).toUTCString(),});res.end(data);});
}).listen(3000, () => {console.log('Server is running on http://localhost:3000');
});

在express中设置静态资源缓存 

const express = require('express');
const app = express();app.use('/static', express.static('public', {maxAge: '1d', // 强制缓存,缓存一天etag: true,   // 协商缓存lastModified: true // 协商缓存
}));app.listen(3000, () => {console.log('Server is running on http://localhost:3000');
});

在koa中设置静态资源缓存

const Koa = require('koa');
const static = require('koa-static');
const path = require('path');const app = new Koa();// 配置静态文件服务
app.use(static(path.join(__dirname, 'public'), {maxage: 86400000, // 设置静态文件的强制缓存时间,这里是一天,单位是毫秒index: false // 关闭默认的索引页
}));// 监听端口
app.listen(3000, () => {console.log('Server is running on http://localhost:3000');
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/15751.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构之栈和队列(超详解

目录 一.栈 1.栈的基本概念 2.栈的基本操作 3.栈的储存结构 ①栈的顺序储存 (1)基本概念 (2)代码实现 ②栈的链式储存 (1)基本概念 (2)代码实现 二.队列 1.队列的基本概念 2.队列的基本操作 3.队列的储存结构 ①队列的链式储存 (1)基本概念 ​编辑 (2)代码实现 ②…

关于回调函数Callback()

今天在写异步通信时发现少写了一个callback&#xff08;&#xff09;回调函数&#xff0c;因此一直无法执行&#xff0c;callback其实可以返回该函数的处理结果&#xff0c;返回的是true值&#xff0c;目前理解是这样&#xff0c;&#xff0c;对于需要验证的值要加上&#xff0…

Spring MVC+mybatis 项目入门:旅游网(一)项目创建与准备

个人博客&#xff1a;Spring MVCmybatis 项目入门:旅游网&#xff08;一&#xff09;项目创建与准备 | iwtss blog 先看这个&#xff01; 这是18年的文章&#xff0c;回收站里恢复的&#xff0c;现阶段看基本是没有参考意义的&#xff0c;技术老旧脱离时代&#xff08;2024年辣…

从0开始学统计-卡方检验

1.什么是卡方检验&#xff1f; 卡方检验是一种用于检验观察频数与期望频数之间差异的统计方法。它通常用于分析分类变量之间的关联性或独立性。在卡方检验中&#xff0c;我们将观察到的频数与期望频数进行比较&#xff0c;从而确定它们之间的差异是否显著。 卡方检验的基本思…

2024-05-23_结构体概念等作业

1.如有以下代码&#xff1a; struct student {int num;char name[32];float score; }stu;则下面的叙述不正确的是&#xff1a;( ) A.struct 是结构体类型的关键字 B.struct student 是用户定义的结构体类型 C.num, score 都是结构体成员名 D.stu 是用户定义的结构体类型名 解析…

【机器学习与大模型】驱动下的应用图像识别与处理

摘要&#xff1a; 本文深入探讨了机器学习在图像识别与处理领域的应用&#xff0c;特别是在大模型的推动下所取得的巨大进展。详细阐述了图像识别与处理的基本原理、关键技术&#xff0c;以及机器学习算法和大模型如何提升其性能和准确性。通过实际案例分析了其在多个领域的广泛…

Flink报错Checkpoint expired before completing

Flink报错Checkpoint expired before completing 报错日志&#xff1a; Failed to trigger or complete checkpoint 42 for job b5d4045c3f466fa91b29d74c5b123c25. (0 consecutive failed attempts so far) org.apache.flink.runtime.checkpoint.CheckpointException: Check…

uniapp实现下拉过滤查询列表

<picker bindchange"bindPickerChanges" value"{{selectedIndex}}"range"{{pickerArray}}"range-key"name"><view class"area-select">在线状态&#xff1a;<label for"">{{pickerArray[select…

虚机配置USB CDROM设备热迁移crash

虚机配置USB CDROM设备热迁移crash 问题现象定位过程堆栈分析日志分析打开trace异常日志上下文分析SpecificationCBWCSW 命令执行发送读命令读取数据 正常日志异常堆栈 修复方案结论 基础原理设备模型数据结构设备实例化 UHCIFrame ListTDQH SCSI 问题现象 dogfood环境一台虚机…

Haskell 的 自定义类型(data、type)

在 Haskell 中&#xff0c;type 和 data 关键字都用于定义新的数据类型&#xff0c;但它们有着不同的作用和语法。 一、type 关键字&#xff1a; 作用&#xff1a;type 关键字用于为已有类型创建别名&#xff0c;使得代码更易读和更具可读性。 语法&#xff1a;其语法为 type…

verilog中的task语句

task语句在Verilog和SystemVerilog中都能使用&#xff0c;但在SystemVerilog中它的功能更加强大&#xff0c;并且添加了一些新的特性。 module ExampleTask;// 定义任务task myTask;input [7:0] a, b;output [15:0] result;beginresult a b;endendtask// 主模块initial begin…

夏日炎炎,手机如何避免变成热源?这些降温技巧分享给你

夏日炎炎&#xff0c;手机也容易“中暑”。 高温不仅会让手机性能大打折扣&#xff0c;还可能引发安全隐患。因此&#xff0c;如何让手机在高温下“冷静”下来&#xff0c;成为了许多手机用户关心的问题。 本文将为你提供一些实用的降温技巧&#xff0c;帮助你的手机安全度过…

小猪APP分发:一站式免费应用推广解决方案

在竞争激烈的移动应用市场中&#xff0c;寻找一个高效且成本友好的方式来推广自己的应用程序&#xff0c;成为了众多开发者面临的共同挑战。幸运的是&#xff0c;像"小猪APP分发www.appzhu.cn"这样的平台应运而生&#xff0c;为开发者提供了一个全面、免费的应用分发…

(优作)风力摆控制系统

本系统由瑞萨 100LGA 单片机控制模块&#xff0c; 6050 三轴陀螺仪加速度模块&#xff0c;直流风机及其驱 动模块&#xff0c;显示模块&#xff0c;键盘模块&#xff0c;蜂鸣器模块以及风力摆机械结构组成&#xff0c; MPU6050 采集风摆姿 态&#xff0c;单片机处理姿态数…

RHCSA —— 第一节 (简介)

目录 一、红帽 RedHat Linux 二、计算机 三、操作系统 四、Linux 入门 一、红帽 RedHat Linux RHCSA英文全称&#xff1a;Red Hat Certified System Administrator &#xff0c;中文全称&#xff1a;红帽认证系统管理员 RHCE英文全称&#xff1a;Red Hat Certified Engi…

TypeScript 的基础类型

1. 布尔类型&#xff08;Boolean&#xff09; 布尔类型表示逻辑上的真或假。在 TypeScript 中&#xff0c;布尔类型只有两个可能的值&#xff1a;true 和 false。例如&#xff1a;typescriptlet isDone: boolean false;### 2. 数字类型&#xff08;Number&#xff09;数字类型…

软件系统部署方案(Word原版文件)

一、 引言 &#xff08;一&#xff09; 编写目的 二、 外部设计 &#xff08;一&#xff09; 标识符和状态 &#xff08;二&#xff09; 约定 1&#xff0e; 数据库涉及字符规范 2&#xff0e; 字段命名规范 &#xff08;三&#xff09; 专门指导 &#xff08;四&#…

C++初阶之模板进阶

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 目录 一.非类型模板参数 二.模板的特化 2.1引入 2.2全特化 2.3…

K-近邻算法(KNN)基础详解

K-近邻算法(K-Nearest Neighbors,简称KNN)是机器学习中一种简单而有效的监督学习方法,用于分类和回归任务。其核心思想基于“物以类聚,人以群分”的原则,通过计算待分类对象与已知数据集中的样本点之间的距离,找出距离最近的K个邻居,然后根据这些邻居的类别或数值来预测…

八、函数和数组

8.1 函数 函数几乎是学习所有的程序设计语言时都必须过的一关。对于学习过其他的程序语言的用户来说&#xff0c;函数可能并不陌生。但是Shell中的函数与其他的程序设计语言的函数有许多不同之处。 8.1.1什么是函数 通俗地讲&#xff0c;所谓函数就是将一组功能相对独立的代码…