27 lines
1.1 KiB
TypeScript
27 lines
1.1 KiB
TypeScript
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;
|
|
}
|