Redis内部如何分离数据?

How to separate data inside Redis?

我想一起使用koa-ratelimit(Koa的限速中间件,它使用Redis)和koa-redis(Koa会话中间件的Redis存储)

像这样:

import ratelimit from "koa-ratelimit";
import Redis from "ioredis";
import Router from "koa-router";
import session from "koa-generic-session";
import redisStore from "koa-redis";
import Koa from "koa";

const app = new Koa();
const router = new Router();
const redisClient = new Redis();

router.post(
  "/auth",
  ratelimit({
    db: redisClient,
    duration: 60000,
    errorMessage: "Sometimes You Just Have to Slow Down.",
    id: (ctx) => ctx.ip,
    headers: {
      remaining: "Rate-Limit-Remaining",
      reset: "Rate-Limit-Reset",
      total: "Rate-Limit-Total",
    },
    max: 100,
    disableHeader: false,
  }),
);

app
  .use(session({
    store: redisStore({
      client: redisClient,
    }),
  }))
  .use(router.routes())
  .use(router.allowedMethods());

两个库都需要 Redis 客户端。 我想在 Redis 中将它们分开。 我有三种方法可以做到:

  1. 前缀。 Node.js 的 Redis 客户端提供了为所有使用的键添加前缀的能力。 (https://github.com/NodeRedis/node_redis#rediscreateclient)问题:它看起来像是一个解决方法。
  2. 数据库。 Redis 服务器提供逻辑数据库。 (https://redis.io/commands/select)问题:Redis CLUSTER只支持一个逻辑数据库。
  3. 分离的 Redis 实例。我可以 运行 将不同端口上的 Redis 实例分开。 问题: 增加了大量管理开销。

哪个选项更好? 或者也许还有其他解决方案?

选项 3 可能是最佳选项,Redis 实例非常轻量级,启动另一个实例不会产生太多开销。

此外,如果您以后想要将这些 "databases" 分开或部署不同的集群,这将使您的生活更轻松。

您可以使用 rate-limiter-flexible

它允许创建带有 keyPrefix 速率限制选项的 koa 中间件,并使用相同的 Redis 客户端 koa-redis