什么是redis以及如何在节点JS中实现redis缓存。
#node #redis #caching

随着互联网的开发,网站现在拥有大量数据。这就是为什么我们需要一种解决方案来降低延迟并提高性能的原因。

在本文中,我们将讨论什么是redis,什么是用途以及如何在nodejs中实现简单的缓存解决方案。
让我们开始吧!

什么是雷迪斯?

redis( re mote di ctionary s erver)是一个开源的内存数据库,主要用于缓存。这是一个NOSQL键值数据存储,键可以存储字符串,列表,集合和位图。

与普通数据库不同,该数据库将数据存储在HDD中。 REDIS将数据存储在内存中,这使得读写操作非常快。这导致应用程序的速度,可靠性和性能更好。

因此,由于Redis将数据存储在内存中,我们是否丢失了此数据?

为了防止数据丢失发生,有一个内置的持久模块将内存状态写入磁盘上的转储文件。系统启动时,将加载这些转储文件;启动并运行后,数据将再次可用。

Redis使用了什么?

缓存

redis通常用作缓存来存储经常访问的数据,因此应用程序可以对用户响应。 Redis提供了多种缓存模式。它包括设置要保留数据多长时间以及首先驱逐数据的能力。

这种情况的典型工作流程是当用户尝试访问数据时,应用程序在缓存中搜索此数据。如果数据在那里,它只会返回它。如果不是,Redis将从数据库中获取此数据,然后将其返回到缓存。

Image description

主数据库

如果数据大小和风险配置文件是众所周知的,并且与Redis磁盘模型匹配,则可以用作主要数据库。

使用REDIS用作主要数据库时可能会遇到的问题。简单的解决方案是聚类和碎片。

聚类意味着您具有主要或主实例,可用于读写数据。您也可以拥有该主要实例的多个复制品用于读取数据。

分片意味着您将数据分成较小的块,每个碎片都负责其自己的数据子集。

Image description

尾巴

redis可以用作消息队列,使应用程序和服务能够相互交流和交换数据。它可以验证,存储,路由并将消息传递到目的地,而无需知道有关接收器的详细信息。

简而言之,消息队列在酒吧/子模型下工作。
发布者负责向队列发布消息。
订户是等待消息传递的终点。

Image description

lua脚本

redis让用户可以在服务器上上传和执行LUA脚本。
这使用户可以以快速执行脚本的形式添加功能以重新设计自己。

REDIS还支持存储各种数据结构,例如可以用于各种用例的流,地理空间,超隙和位图。

如何在node.js中实现redis缓存

在本节中,我们将与nodejs一起使用redis。这个想法很简单,我们创建了一个API,可以捕获GitHub用户的公共存储库数量。然后,我们将使用redis缓存此结果。

让我们从安装所需的NPM软件包开始:

npm install express node-fetch redis

如果您还没有安装Redis,则可以从here安装它。

创建一个空的JavaScript文件并添加以下代码:

const express = require('express');
const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args));
const redis = require('redis');

const PORT = 8000;
const REDIS_PORT = 6379;

const client = redis.createClient({
    legacyMode: true,
    PORT: REDIS_PORT
});

client
    .connect()
    .then(async () => {
        console.log("You are connected")
})
    .catch((err) => {
        console.log("error happened", err)
});

const app = express();

我们需要将使用的模块以及重新端口和服务器端口。接下来,创建一个客户端并连接到该客户端。
请注意,您需要在创建REDIS客户端之前运行REDIS服务器。
最后一步是创建一个Express App。

现在,让我们一个获得存储库总数的函数。

// send a request to Github for data
getRepos = async (req, res, next) => {
  try {
    console.log('Fetching Data...');
    const { username } = req.params;
    const response = await fetch(`https://api.github.com/users/${username}`);
    const data = await response.json();
    const repos = data.public_repos;
    // Set data to Redis
    await client.setex(username, 3600, repos);
    res.json({username, repos});
  } catch (err) {
    console.error(err);
    res.status(500);
  };
};

在此功能中,我们从请求参数获取用户名,并使用node-fetch发送请求。

之后,使用.setex函数设置客户端的(键,数据到秒,值,值)。最后返回JSON中的响应。

现在,让我们创建一个返回缓存数据的缓存中间件。

cache = async (req, res, next) => {
  const { username } = req.params;
  client.get(username, (err, repos) => {
    if (err) throw err;
    if (repos !== null) {
      res.json({data:"cached data", username, repos});
    } else {
      next();
    };
  });
};

像我们以前一样,我们从参数中获得用户名。然后重新搜索具有相同用户名的键。
如果Redis找到数据将返回,否则,中间件将执行接下来的内容。

最后一步是在开始服务器中注册创建路由。

app.get('/repos/:username', cache, getRepos);

app.listen(PORT, () => {
  console.log(`App listening on port ${PORT}`);
});

让我们测试一下!

Image description

您可以从图像中看到,我们发送了一个请求,大约需要372毫秒才能获取数据。

现在让我们再次发送相同的请求以获取缓存的数据。

Image description

这很快!
从内存中获取缓存的数据只需5 ms。

结论

在本文中,我们讨论了redis及其使用的目的,我们还经历了redis在nodejs中的实现。

在简介中,redis a nosql键/值存储,可以使用缓存数据库。 redis也可以用作消息队列和主数据库。

如果您觉得这篇文章很有价值,请考虑与其他人分享!