构建一个可以缓存的App

让我们看一下尝试在没有 Redis 的情况下构建一个缓存响应数据的应用程序。我们可以使用全局变量。一旦进程终止,该变量将被销毁,正如您所见,我们不再拥有持久缓存,因为我们使用了一个临时变量。

Redis 救援

[redis-logo-cropped.png](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 实例,请登录并选择您的数据库,然后转到配置页面,您可以在其中找到您的连接环境变量。

[Redis 实验室配置](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
  }
});

进入全屏模式 退出全屏模式

将缓存 getAsyncsetAsync 添加到所有 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 媒体

Logo

Redis社区为您提供最前沿的新闻资讯和知识内容

更多推荐