推荐答案
在 Express 中实现缓存可以通过多种方式,以下是几种常见的缓存策略:
- 内存缓存:使用内存缓存库如
memory-cache或node-cache来存储数据,减少对数据库或外部 API 的频繁请求。 - HTTP 缓存:通过设置 HTTP 头(如
Cache-Control和ETag)来利用浏览器或代理服务器的缓存机制。 - Redis 缓存:使用 Redis 作为分布式缓存,适用于需要跨多个实例共享缓存的场景。
- 文件系统缓存:将缓存数据存储在文件系统中,适用于需要持久化缓存数据的场景。
本题详细解读
1. 内存缓存
内存缓存是最简单的缓存方式,适用于单实例应用。可以使用 memory-cache 或 node-cache 库来实现。
// www.javascriptcn.com code example
const cache = require('memory-cache');
app.get('/data', (req, res) => {
const cachedData = cache.get('data');
if (cachedData) {
return res.send(cachedData);
}
// 模拟从数据库获取数据
const data = fetchDataFromDatabase();
cache.put('data', data, 10000); // 缓存10秒
res.send(data);
});2. HTTP 缓存
通过设置 HTTP 头,可以利用浏览器或代理服务器的缓存机制。
app.get('/static-data', (req, res) => {
res.set('Cache-Control', 'public, max-age=3600'); // 缓存1小时
res.send(fetchStaticData());
});3. Redis 缓存
Redis 是一个高性能的键值存储系统,适用于分布式缓存。
// www.javascriptcn.com code example
const redis = require('redis');
const client = redis.createClient();
app.get('/redis-data', (req, res) => {
client.get('data', (err, data) => {
if (data) {
return res.send(JSON.parse(data));
}
// 模拟从数据库获取数据
const newData = fetchDataFromDatabase();
client.setex('data', 3600, JSON.stringify(newData)); // 缓存1小时
res.send(newData);
});
});4. 文件系统缓存
将缓存数据存储在文件系统中,适用于需要持久化缓存数据的场景。
// www.javascriptcn.com code example
const fs = require('fs');
const path = require('path');
app.get('/file-data', (req, res) => {
const filePath = path.join(__dirname, 'cache', 'data.json');
if (fs.existsSync(filePath)) {
const data = fs.readFileSync(filePath, 'utf8');
return res.send(JSON.parse(data));
}
// 模拟从数据库获取数据
const newData = fetchDataFromDatabase();
fs.writeFileSync(filePath, JSON.stringify(newData));
res.send(newData);
});