deno.com
在本页

如何在 Deno 中使用 Redis

Redis 是一个内存数据存储,你可以用它来进行缓存、作为消息代理或用于流式传输数据。

在这里查看源代码。

在这里,我们将设置 Redis 来缓存来自 API 调用的数据,以加速后续对该数据的任何请求。我们将要

  • 设置一个 Redis 客户端,以将每次 API 调用的数据保存在内存中
  • 设置一个 Deno 服务器,以便我们可以轻松请求特定数据
  • 在服务器处理程序中调用 Github API,以在首次请求时获取数据
  • 在后续的每个请求中从 Redis 提供数据

我们可以在单个文件 main.ts 中完成此操作。

连接到 Redis 客户端 Jump to heading

我们需要两个模块。第一个是 Deno 服务器。我们将使用它来从用户那里获取信息以查询我们的 API。第二个是 Redis。我们可以使用 npm: 修饰符来获取 Redis 的 node 包

import { createClient } from "npm:redis@^4.5";

我们使用 createClient 创建一个 Redis 客户端,并连接到我们的本地 Redis 服务器

// make a connection to the local instance of redis
const client = createClient({
  url: "redis://localhost:6379",
});

await client.connect();

你也可以在这个 configuration 对象中单独设置 host、user、password 和 port。

设置服务器 Jump to heading

我们的服务器将充当 Github API 的包装器。客户端可以使用 URL 路径名中的 Github 用户名调用我们的服务器,例如 http://localhost:3000/{username}

解析路径名并调用 Github API 将在我们服务器的处理函数内部进行。我们去除前导斜杠,以便留下一个变量,我们可以将其作为用户名传递给 Github API。然后我们将响应传递回用户。

Deno.serve({ port: 3000 }, async (req) => {
  const { pathname } = new URL(req.url);
  // strip the leading slash
  const username = pathname.substring(1);
  const resp = await fetch(`https://api.github.com/users/${username}`);
  const user = await resp.json();
  return new Response(JSON.stringify(user), {
    headers: {
      "content-type": "application/json",
    },
  });
});

我们将使用以下命令运行它

deno run --allow-net main.ts

如果我们然后在 Postman 中访问 http://localhost:3000/ry,我们将获得 Github 响应

uncached-redis-body.png

让我们使用 Redis 缓存此响应。

检查缓存 Jump to heading

一旦我们从 Github API 获得响应,我们就可以使用 client.set 在 Redis 中缓存它,以我们的用户名为键,用户对象为值

await client.set(username, JSON.stringify(user));

下次我们请求相同的用户名时,我们可以使用 client.get 来获取缓存的用户

const cached_user = await client.get(username);

如果键不存在,则返回 null。所以我们可以在一些流程控制中使用它。当我们获得用户名时,我们最初会检查我们是否已经在缓存中拥有该用户。 如果有,我们将提供缓存的结果。 如果没有,我们将调用 Github API 获取用户,缓存它,然后提供 API 结果。 在这两种情况下,我们都会添加一个自定义标头来显示我们正在提供的版本

const server = new Server({
  handler: async (req) => {
    const { pathname } = new URL(req.url);
    // strip the leading slash
    const username = pathname.substring(1);
    const cached_user = await client.get(username);
    if (cached_user) {
      return new Response(cached_user, {
        headers: {
          "content-type": "application/json",
          "is-cached": "true",
        },
      });
    } else {
      const resp = await fetch(`https://api.github.com/users/${username}`);
      const user = await resp.json();
      await client.set(username, JSON.stringify(user));
      return new Response(JSON.stringify(user), {
        headers: {
          "content-type": "application/json",
          "is-cached": "false",
        },
      });
    }
  },

  port: 3000,
});

server.listenAndServe();

首次运行它会给我们与上面相同的响应,我们将看到 is-cached 标头设置为 false

uncached-redis-header.png

但是再次使用相同的用户名调用,我们就会得到缓存的结果。正文是相同的

cached-redis-body.png

但是标头显示我们有缓存

cached-redis-header.png

我们还可以看到响应速度快了约 200 毫秒!

你可以在这里查看 Redis 文档,在这里查看 Redis node 包。

你找到你需要的内容了吗?

隐私政策