如何将 Redis 与 Express 一起使用
构建一个可以缓存的App 让我们看一下尝试在没有 Redis 的情况下构建一个缓存响应数据的应用程序。我们可以使用全局变量。一旦进程终止,该变量将被销毁,正如您所见,我们不再拥有持久缓存,因为我们使用了一个临时变量。 Redis 救援 [](https://res.cloudinary.com/practicaldev/image/fetch/s--XIIVfWJN--/c_limit%2Cf_a
构建一个可以缓存的App
让我们看一下尝试在没有 Redis 的情况下构建一个缓存响应数据的应用程序。我们可以使用全局变量。一旦进程终止,该变量将被销毁,正如您所见,我们不再拥有持久缓存,因为我们使用了一个临时变量。
Redis 救援
[](https://res.cloudinary.com/practicaldev/image/fetch/s--XIIVfWJN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:// /cdn.hashnode.com/res/hashnode/image/upload/v1620163300620/RhY8enPo4.png)
当您想要将数据持久保存在内存中时,Redis 确实非常有用,以便更快地访问,从而允许您将其用作缓存。那么 Redis 做了什么,Redis 是一个内存数据存储,但是一个持久的磁盘数据库,这意味着我们可以将 Redis 用作一个数据库,它可以直接在内存中执行读取和写入,同时还可以在 Redis 服务器写入磁盘时实现持久性不时。
让我们开始编码
对于本教程,我决定将 express 作为服务器和 mongoose ODM 与 JavaScript 结合使用。
要在节点服务器中使用 Redis,我们需要一个 Redis 驱动程序,我们将使用官方的Redis 包。
让我们安装依赖项:
npm i express mongoose redis dotenv
npm i -D nodemon
进入全屏模式 退出全屏模式
设置完成后,我们可以继续配置我们的.env
文件。
MONGODB_URI=<your mongodb connection string>
进入全屏模式 退出全屏模式
如果您在本地配置了 Redis,则可以跳过 REDIS_* 变量,只需传入密码即可。
如果您使用 docker 容器,请使用映射到 6379 的端口(或此处为 63791 之类的其他端口)启动它。
docker run --name some-redis -d -p 63791:6379 redis
进入全屏模式 退出全屏模式
如果您使用了 Redislabs 实例,请登录并选择您的数据库,然后转到配置页面,您可以在其中找到您的连接环境变量。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--2QxA4ggU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode .com/res/hashnode/image/upload/v1620251015217/pJP2t2wOT.png)
.env
REDIS_HOST=<your Redis HOST>
REDIS_PORT=<your Redis PORT>
REDIS_PASSWORD=<your config PASSWORD>
进入全屏模式 退出全屏模式
我们完全配置为在我们的应用程序中使用 Redis。为了使本文简短,我将跳过设置 mongoose 和 express,因为这是在任何节点应用程序中使用 Redis 的更通用的方法。
(您可以在GitHub 存储库上找到模型、控制器等的代码)
让我们在我们的index.js
中设置 Redis 客户端,将以下几行添加到您的代码中。
index.js
import redis from "redis";
import { promisify } from "util";
// create redis client
const client = redis.createClient({
host: process.env.REDIS_HOST,
port: parseInt(process.env.REDIS_PORT),
password: process.env.REDIS_PASSWORD,
});
// redis.js doesn't support async utils as of writing this article
// we can use the recommended workaround
export const getAsync = promisify(client.get).bind(client);
export const setAsync = promisify(client.set).bind(client);
进入全屏模式 退出全屏模式
我们将使用 getAsync 从 Redis 存储中获取值,并使用 setAsync 在我们的 Redis 存储中设置值。
当我们通过 Get 请求请求数据时,我们需要修改我们的 API 以使用缓存。
Express GET route
app.get("/api/<resource>", async (req, res) => {
try {
// Get from cache using the "Key"
const getRes = await getAsync("resourceKey" );
if (getRes)
return res.json({ success: true, data: JSON.parse(getRes) });
// On cache-miss => query database
const users = await <Model>.find({});
// Set cache
await setAsync("resourceKey", // Key
JSON.stringify({res}), // Value
"EX", // Set explicit expiry
60 // TTL in seconds
);
return res.status(200).json({success: true, data: <resource>});
} catch (error) {
// Handle errors
}
});
进入全屏模式 退出全屏模式
将缓存 getAsync 和 setAsync 添加到所有 GET 路由中,就是这样。现在,您的 express 服务器有了基本的缓存设置。
🎉🎉🎉 超快速高效的缓存。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--yh4ZXRQp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode .com/res/hashnode/image/upload/v1620472594063/xhuJAAre3.png)
本博客是Redis学习系列的一部分,在上一篇文章中,我已经解释了使用 3 种不同方式设置 Redis。
请随时通过 Twitter@cryptus_neoxys与我联系,并通过LinkedIn与我联系。
参考
NPM Redis.js
yoursTRULY YouTube
Traversy 媒体
更多推荐
所有评论(0)