如何在Redis中分离数据?

时间:2018-12-22 19:04:49

标签: javascript node.js redis koa

我想一起使用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的单独实例。 问题:添加了大量的管理开销。

哪个选项更好? 也许还有另一种解决方案?

2 个答案:

答案 0 :(得分:1)

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

此外,如果您将来希望将那些“数据库”分开或进行不同的集群部署,这将使您的生活更轻松。

答案 1 :(得分:0)

您可以使用rate-limiter-flexible

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