缓存您的 Express 应用
缓存您的 Express 应用
由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!
缓存您的 Express 应用
What is caching?
通过网络获取数据既慢又费钱。大型响应需要在客户端和服务器之间进行多次往返,这会延迟数据的可用时间和浏览器的处理时间,同时也会增加访问者的数据流量成本。因此,缓存和重用先前获取的资源是优化性能的关键。Redis
是一个开源(BSD 许可)的内存数据结构存储系统,可用作数据库、缓存和消息代理。Redis 始终在服务器的主内存中提供和修改数据。其优势在于系统能够快速检索所需数据。Redis 通过创建出色的内存缓存来降低访问延迟,从而帮助关系型数据库或 NoSQL 提升负载性能。使用 Redis,我们可以使用 SET 和 GET 方法来存储缓存,此外,Redis 还可以处理列表、集合、有序数据结构等复杂数据类型。
安装
安装 Redis 非常简单。您可以查看安装链接。
要向 Node.js 添加 Redis 客户端,只需执行以下操作:
npm i redis
为了简单起见,我们将使用以下示例,其中我将在一个 Express 应用中从外部 API 获取一些数据。
const express = require('express');
const responseTime = require('response-time')
//Load Express Framework
var app = express();
//Create a middleware that adds a X-Response-Time header to responses.
app.use(responseTime());
const axios = require('axios')
async getDogs(req,res) {
try {
const dogs = await axios.get('https://dog.ceo/api/breeds/list/all');
res.send(dogs);
} catch (error) {
console.error(error)
res.send('Something went wrong!!!');
}
}
app.get('/dogs', getDogs);
app.listen(3000, function() {
console.log('Your app is running on port 3000 !!!')
});
这是一个简单的 Express 应用,它从 Dogs API 获取数据,而无需在端点上部署 Redis。虽然很简单
,但缺点是,如果我们已经获取过数据,并且服务器上的数据没有被修改,那么每次请求时就没有必要再获取数据了。
这是相同的代码,但这次我们添加了一个缓存层。Redis
const express = require('express');
const responseTime = require('response-time')
const redis = require('redis');
const client = redis.createClient();
//Load Express Framework
var app = express();
//Create a middleware that adds a X-Response-Time header to responses.
app.use(responseTime());
const axios = require('axios')
async getDogs(req,res) {
try {
client.get('dogsdata', (err, result) => {
if (result) {
res.send(result);
} else {
const dogs = await axios.get('https://dog.ceo/api/breeds/list/all');
// Set the string-key:dogsdata in our cache. With he contents of the cache
// Set cache expiration to 1 hour (60 minutes)
client.setex('dogsdata', 3600, JSON.stringify(dogs));
}
});
} catch (error) {
console.error(error)
res.send('Something went wrong!!!');
}
}
app.get('/dogs', getDogs);
app.listen(3000, function() {
console.log('Your app is running on port 3000 !!!')
});
首先,我们通过标签从缓存中获取数据dogsdata。如果缓存中存在数据,则直接提供数据;否则,通过 axios 向 API 发出请求。每次调用 API 时,缓存都会更新为最新数据。
请记住,Redis 是一个键值存储,因此用于存储数据的键必须与用于获取数据的键相同。dogsdata
对比两种实现方式,可以看出缓存可以将请求处理时间缩短近 99% 以上。
请在 GitHub 上关注我:www.github.com/rubiin
文章来源:https://dev.to/rubiin/caching-your-express-app-27kg