随着互联网的开发,网站现在拥有大量数据。这就是为什么我们需要一种解决方案来降低延迟并提高性能的原因。
在本文中,我们将讨论什么是redis,什么是用途以及如何在nodejs中实现简单的缓存解决方案。
让我们开始吧!
什么是雷迪斯?
redis( re mote di ctionary s erver)是一个开源的内存数据库,主要用于缓存。这是一个NOSQL键值数据存储,键可以存储字符串,列表,集合和位图。
与普通数据库不同,该数据库将数据存储在HDD中。 REDIS将数据存储在内存中,这使得读写操作非常快。这导致应用程序的速度,可靠性和性能更好。
因此,由于Redis将数据存储在内存中,我们是否丢失了此数据?
为了防止数据丢失发生,有一个内置的持久模块将内存状态写入磁盘上的转储文件。系统启动时,将加载这些转储文件;启动并运行后,数据将再次可用。
Redis使用了什么?
缓存
redis通常用作缓存来存储经常访问的数据,因此应用程序可以对用户响应。 Redis提供了多种缓存模式。它包括设置要保留数据多长时间以及首先驱逐数据的能力。
这种情况的典型工作流程是当用户尝试访问数据时,应用程序在缓存中搜索此数据。如果数据在那里,它只会返回它。如果不是,Redis将从数据库中获取此数据,然后将其返回到缓存。
主数据库
如果数据大小和风险配置文件是众所周知的,并且与Redis磁盘模型匹配,则可以用作主要数据库。
使用REDIS用作主要数据库时可能会遇到的问题。简单的解决方案是聚类和碎片。
聚类意味着您具有主要或主实例,可用于读写数据。您也可以拥有该主要实例的多个复制品用于读取数据。
分片意味着您将数据分成较小的块,每个碎片都负责其自己的数据子集。
尾巴
redis可以用作消息队列,使应用程序和服务能够相互交流和交换数据。它可以验证,存储,路由并将消息传递到目的地,而无需知道有关接收器的详细信息。
简而言之,消息队列在酒吧/子模型下工作。
发布者负责向队列发布消息。
订户是等待消息传递的终点。
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}`);
});
让我们测试一下!
您可以从图像中看到,我们发送了一个请求,大约需要372毫秒才能获取数据。
现在让我们再次发送相同的请求以获取缓存的数据。
这很快!
从内存中获取缓存的数据只需5 ms。
结论
在本文中,我们讨论了redis及其使用的目的,我们还经历了redis在nodejs中的实现。
在简介中,redis a nosql键/值存储,可以使用缓存数据库。 redis也可以用作消息队列和主数据库。
如果您觉得这篇文章很有价值,请考虑与其他人分享!