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