繁体   English   中英

将 Redis Singleton 用于 NextJS API 路由

[英]Using a Redis Singleton for NextJS API Routes

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

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

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

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

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

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

您可以使用全局变量。 以下 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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM