为NextJS API路由使用Redis Singleton



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

  • /api/user/[id]
  • /api/问题
  • /api/帖子

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

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

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

如何在NextJS应用程序中创建一个Redis连接实例,仅用于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;

相关内容

  • 没有找到相关文章

最新更新