面试题答案
一键面试常见的HTTP请求缓存策略
- 强缓存:通过设置
Cache-Control
和Expires
头字段实现。Cache-Control
优先级高于Expires
。Cache-Control
:例如设置Cache-Control: max-age=3600
,表示资源在3600秒(1小时)内有效,在此期间浏览器不会向服务器发送请求,直接使用本地缓存。Expires
:设置一个绝对的过期时间,如Expires: Thu, 01 Dec 2022 16:00:00 GMT
,在这个时间之前浏览器使用本地缓存。
- 协商缓存:使用
Last - Modified
/If - Modified - Since
和ETag
/If - None - Match
。Last - Modified
/If - Modified - Since
:服务器在响应头中设置Last - Modified
表示资源最后修改时间,客户端下次请求带上If - Modified - Since
,服务器对比时间,如果资源未修改则返回304状态码,客户端使用本地缓存。ETag
/If - None - Match
:服务器生成一个唯一标识资源的ETag
,客户端下次请求带上If - None - Match
,服务器对比ETag
,如果相同返回304,客户端使用本地缓存。
使用http
模块结合缓存策略处理HTTP请求
以下是一个简单示例,使用内存缓存来处理HTTP请求:
const http = require('http');
const url = require('url');
// 内存缓存对象
const cache = {};
const server = http.createServer((req, res) => {
const parsedUrl = url.parse(req.url, true);
const key = req.url;
if (cache[key]) {
// 如果缓存中有数据,直接返回缓存数据
res.writeHead(200, { 'Content - Type': 'application/json' });
res.end(JSON.stringify(cache[key]));
} else {
// 模拟请求处理
setTimeout(() => {
const data = { message: 'This is a response' };
cache[key] = data;
res.writeHead(200, { 'Content - Type': 'application/json' });
res.end(JSON.stringify(data));
}, 1000);
}
});
const port = 3000;
server.listen(port, () => {
console.log(`Server running on port ${port}`);
});
在上述代码中:
- 定义了一个
cache
对象用于存储缓存数据。 - 在
http
服务器的请求处理函数中,首先检查请求的url
是否在缓存中,如果存在则直接返回缓存数据。 - 如果缓存中不存在,则模拟请求处理(这里用
setTimeout
模拟耗时操作),处理完成后将数据存入缓存并返回给客户端。