【问题标题】: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;