【问题标题】:Using a Redis Singleton for NextJS API Routes为 NextJS API 路由使用 Redis 单例
【发布时间】:2023-01-24 01:58:42
【问题描述】:

在我的 NextJS 应用程序中,我有多个 API 路由:

  • /api/用户/[id]
  • /api/问题
  • /api/帖子

这些端点中的每一个都使用 Redis 连接到 Redis 服务器中的 get 或 put 数据。

我注意到我的控制台出现错误,因为我与 Redis 服务器建立了太多连接。所以我有了创建一个单例类并在单例中连接到 Redis 服务器一次的想法。 getInstance() 返回连接。

但我注意到我的单例是为每个 API 路由创建一次。 NextJS 是否做了什么导致这种情况发生?

我如何在 NextJS 应用程序中创建 1 个 Redis 连接实例,仅用于 pages/api 内的 API 路由?我正在使用 ioredis 库。

【问题讨论】:

  • 有什么解决办法吗?

标签: javascript reactjs redis next.js ioredis


【解决方案1】:

您可以使用全局变量。下面的 redis 设置应该适用于使用 redis 云免费实例的 nextJS,该实例在免费计划中最多有 30 个可用连接。

代码:

import * as redis from 'redis';

const REDIS_USERNAME = process.env.REDIS_USERNAME;
const REDIS_PASSWORD = process.env.REDIS_PASSWORD;
const REDIS_HOST = process.env.REDIS_HOST;
const REDIS_PORT = process.env.REDIS_PORT;

let redisClient;
let redisClientPromise;

if (process.env.NEXT_PUBLIC_NODE_ENV === 'development') {
    if (!global._redisClientPromise) {
        redisClient = redis.createClient({
            url: `redis://${REDIS_USERNAME}:${REDIS_PASSWORD}@${REDIS_HOST}:${REDIS_PORT}`
        });
        redisClient.connect().then(() => {
            console.info(
                `NextJS Redis client connected..`
            );
        }).catch((error) => {
            console.error(`[ERROR] Couldn't connect to Redis client: ${error}`);
        });
        global._redisClientPromise = redisClient;
    }
    redisClientPromise = global._redisClientPromise
} else {
    redisClient = redis.createClient({
        url: `redis://${REDIS_USERNAME}:${REDIS_PASSWORD}@${REDIS_HOST}:${REDIS_PORT}`
    });
    redisClient.connect().then(() => {
        console.info(
            `NextJS Redis client connected..`
        );
    }).catch((error) => {
        console.error(`[ERROR] Couldn't connect to Redis client: ${error}`);
    });
    redisClientPromise = redisClient;
}

export default redisClientPromise;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-19
    • 2021-08-24
    • 2022-12-05
    • 2021-07-16
    • 2020-05-02
    • 2021-01-10
    • 2021-07-04
    • 2019-12-24
    相关资源
    最近更新 更多