在我的NextJS应用程序中,我有多个API路由:
- /api/user/[id]
- /api/问题
- /api/帖子
这些端点中的每一个都使用Redis连接到Redis服务器中的get
或put
数据。
我注意到我的控制台中出现了错误,因为我与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;