Redis Singleton for Next.js App router
redis.tsTypeScript
redis.ts
import { createClient } from "redis";
import { env } from "~/env";
class RedisClient {
private static instance: ReturnType<typeof createClient> | null = null;
private static connectionCount: number = 0;
private constructor() {}
public static async getInstance(): Promise<ReturnType<typeof createClient>> {
if (!RedisClient.instance) {
console.log("Creating new Redis connection...");
RedisClient.instance = createClient({
url: `redis://${env.REDIS_HOST}:${env.REDIS_PORT}`,
});
await RedisClient.instance.connect();
RedisClient.connectionCount++;
console.log(
`Redis connection established. Connection count: ${RedisClient.connectionCount}`
);
} else {
console.log(
`Reusing existing Redis connection. Connection count: ${RedisClient.connectionCount}`
);
}
return RedisClient.instance;
}
public static getConnectionCount(): number {
return RedisClient.connectionCount;
}
public static async closeConnection(): Promise<void> {
if (RedisClient.instance) {
await RedisClient.instance.quit();
RedisClient.instance = null;
RedisClient.connectionCount = 0;
console.log("Redis connection closed.");
}
}
}
export default RedisClient;
Updated: 9/5/2024