import { Redis } from "ioredis"; import { log } from "@kokorone/shared"; let client: Redis | null = null; let loggedUnavailable = false; // R-2:session 快取/情緒狀態即時讀寫改走 Redis。連線失敗時呼叫端一律要能安全退回原本的行為 // (工作記憶退回行程記憶體 Map、情緒狀態退回直接讀寫 Prisma),Redis 只是加速層,不是新的必要依賴, // 這樣即使部署環境還沒有 Redis(例如這個沒有 Docker/sudo 的沙盒),既有行為也不會被打斷。 export function getRedisClient(): Redis { if (!client) { client = new Redis(process.env.REDIS_URL ?? "redis://127.0.0.1:6379", { lazyConnect: true, maxRetriesPerRequest: 1, retryStrategy: () => null, connectTimeout: 300, }); client.on("error", () => { if (!loggedUnavailable) { loggedUnavailable = true; log("啟動", "WRN", `Redis 無法連線(REDIS_URL=${process.env.REDIS_URL ?? "redis://127.0.0.1:6379"}),相關快取將退回原本行為`); } }); } return client; }