使用 Redis Singleton 进行 NextJS API 路由

Jon*_*800 6 javascript redis reactjs ioredis next.js

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

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

这些端点中的每一个都使用与 Redis 服务器的 Redis 连接getputRedis 服务器中的数据。

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

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

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

roc*_*one 0

您可以使用全局变量。下面的 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;
Run Code Online (Sandbox Code Playgroud)