当前位置: 首页 > news >正文

70 # 协商缓存的配置:通过修改时间

对比(协商)缓存

比较一下再去决定是用缓存还是重新获取数据,这样会减少网络请求,提高性能。

对比缓存的工作原理

客户端第一次请求服务器的时候,服务器会把数据进行缓存,同时会生成一个缓存标识符,这个缓存标识符会被发送到客户端,客户端第二次请求服务器的时候,会把缓存标识符发送到服务器,服务器会根据缓存标识符进行判断,如果缓存标识符相同,则服务器会判断缓存是否过期,如果没有过期,则服务器会返回 304,告诉客户端使用缓存,如果缓存标识符不同,则服务器会返回 200,同时返回新的数据。

  • 客户端:if-modified-since
  • 服务端:Last-Modified 对比最后的修改时间返回内容

缺点是内容没变化修改时间变化了也会重新读取内容,时间不精确,(精确到秒),如果一秒内改了多次也监控不到。

下面我们通过判断文件的修改时间是否对的上,一样的话直接返回 304 告诉读取缓存

新建 cache.js 文件

const http = require("http");
const fs = require("fs");
const path = require("path");
const url = require("url");const server = http.createServer((req, res) => {const { pathname } = url.parse(req.url);const filePath = path.join(__dirname, pathname);console.log(pathname);res.setHeader("Cache-Control", "no-cache");// 第二次请求会带上 if-modified-since 请求头let ifModifiedSince = req.headers["if-modified-since"];fs.stat(filePath, (err, statObj) => {if (err) return res.end();let lastModified = statObj.ctime.toGMTString();// 判断文件的修改时间是否对的上,一样的话直接返回 304 告诉读取缓存if (ifModifiedSince && lastModified === ifModifiedSince) {res.statusCode = 304;return res.end();}res.setHeader("Last-Modified", lastModified);if (err) return (res.statusCode = 404), res.end("Not Found");// 判断是否是文件if (statObj.isFile()) {fs.createReadStream(filePath).pipe(res);} else {res.statusCode = 404;res.end("Not Found");}});
});
server.listen(5000);

然后新建 public 文件夹,里面添加 index.htmlstyle.css

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>凯小默测试对比缓存:通过修改时间</title>
</head><body><link rel="stylesheet" href="/public/style.css">
</body></html>
body {background-color: seagreen;
}

我们启动服务,访问 http://127.0.0.1:5000/public/index.html,可以看到第二次请求的资源变成了 304

nodemon cache.js

在这里插入图片描述

在这里插入图片描述
我们修改 style.css 文件,背景改成 pink,然后刷新访问,我们可以看到状态码变成 200,读取到了新的资源

body {background-color: pink;
}

在这里插入图片描述

http://www.lryc.cn/news/132772.html

相关文章:

  • 适合程序员的DB性能测试工具 JMeter
  • java实现人物关系抽取
  • Docker网络与资源控制
  • 图片怎么转换成pdf格式?可以试试这样转换
  • [国产MCU]-W801开发实例-GPIO输入与中断
  • Layui列表表头去掉复选框改为选择
  • Flutter实战·第二版-第三章 基础组件笔记
  • 一文彻底理解时间复杂度和空间复杂度(附实例)
  • Mysql的索引详解
  • .netcore windows app启动webserver
  • 泰迪大数据挖掘建模平台功能特色介绍
  • 【问题】java序列化,什么时候使用
  • 【最新可用】VMware中ubuntu与主机window之间使用共享文件夹传输大文件
  • A. Two Semiknights Meet
  • 〔011〕Stable Diffusion 之 解决绘制多人或面部很小的人物时面部崩坏问题 篇
  • 在ubuntu+cpolar+rabbitMQ环境下,实现mq服务端远程访问
  • Vue elementui 实现表格selection的默认勾选,翻页记录勾选状态
  • CloudCompare——统计滤波
  • nodejs+vue古诗词在线测试管理系统
  • 174-地下城游戏
  • Linux定时任务crontab
  • golang字符串切片去重
  • git如何检查和修改忽略文件和忽略规则
  • Android AppCompatActivity标题栏操作
  • 解决conda activate报错
  • FreeMarker--表达式和运算符的用法(全面/有示例)
  • 设计模式 -- 策略模式(传统面向对象与JavaScript 的对比实现)
  • 非常详细的 Ceph 介绍、原理、架构
  • js 的正则表达式(二)
  • 星际争霸之小霸王之小蜜蜂(四)--事件监听-让小蜜蜂动起来