Files
Kokorone/apps/api/src/cache/redis-client.ts
T

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;
}