发布于 2026-01-06 1 阅读
0

缓存你的 Express 应用 缓存你的 Express 应用 由 Mux 呈现的 DEV 全球展示挑战赛:展示你的项目!

缓存您的 Express 应用

缓存您的 Express 应用

由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!

缓存您的 Express 应用

What is caching?
通过网络获取数据既慢又费钱。大型响应需要在客户端和服务器之间进行多次往返,这会延迟数据的可用时间和浏览器的处理时间,同时也会增加访问者的数据流量成本。因此,缓存和重用先前获取的资源是优化性能的关键。Redis
是一个开源(BSD 许可)的内存数据结构存储系统,可用作数据库、缓存和消息代理。Redis 始终在服务器的主内存中提供和修改数据。其优势在于系统能够快速检索所需数据。Redis 通过创建出色的内存缓存来降低访问延迟,从而帮助关系型数据库或 NoSQL 提升负载性能。使用 Redis,我们可以使用 SET 和 GET 方法来存储缓存,此外,Redis 还可以处理列表、集合、有序数据结构等复杂数据类型。

安装

安装 Redis 非常简单。您可以查看安装链接。

要向 Node.js 添加 Redis 客户端,只需执行以下操作:

npm i redis
Enter fullscreen mode Exit fullscreen mode

为了简单起见,我们将使用以下示例,其中我将在一个 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 !!!')
});

Enter fullscreen mode Exit fullscreen mode

这是一个简单的 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 !!!')
});

Enter fullscreen mode Exit fullscreen mode

首先,我们通过标签从缓存中获取数据dogsdata。如果缓存中存在数据,则直接提供数据;否则,通过 axios 向 API 发出请求。每次调用 API 时,缓存都会更新为最新数据。
请记住,Redis 是一个键值存储,因此用于存储数据的键必须与用于获取数据的键相同。dogsdata

对比两种实现方式,可以看出缓存可以将请求处理时间缩短近 99% 以上。

请在 GitHub 上关注我:www.github.com/rubiin

文章来源:https://dev.to/rubiin/caching-your-express-app-27kg