diff --git a/.env.example b/.env.example index e03069733..aca76ffb9 100644 --- a/.env.example +++ b/.env.example @@ -72,6 +72,12 @@ STORE_SESSION_MESSAGES=false # 是否存储请求 messages 到 Redis # - 启用:适用于网络稳定环境,连续网络错误也应触发熔断保护,避免持续请求不可达的供应商 ENABLE_CIRCUIT_BREAKER_ON_NETWORK_ERRORS=false +# 供应商缓存配置 +# 功能说明:控制是否启用供应商进程级缓存 +# - true (默认):启用缓存,30s TTL + Redis Pub/Sub 跨实例即时失效,提升供应商查询性能 +# - false:禁用缓存,每次请求直接查询数据库(适用于调试或单机低并发场景) +ENABLE_PROVIDER_CACHE=true + # Fetch 连接超时配置 # 功能说明:控制 TCP 连接建立超时时间(包括 DNS 查询、TCP 握手、TLS 握手) # - 默认值:30000 毫秒(30 秒) diff --git a/src/lib/cache/provider-cache.ts b/src/lib/cache/provider-cache.ts index c0415e6ba..32b2efd81 100644 --- a/src/lib/cache/provider-cache.ts +++ b/src/lib/cache/provider-cache.ts @@ -11,10 +11,14 @@ import "server-only"; +import { getEnvConfig } from "@/lib/config"; import { logger } from "@/lib/logger"; import { publishCacheInvalidation, subscribeCacheInvalidation } from "@/lib/redis/pubsub"; import type { Provider } from "@/types/provider"; +// 模块级别读取配置,避免热路径函数中频繁调用 +const { ENABLE_PROVIDER_CACHE } = getEnvConfig(); + export const CHANNEL_PROVIDERS_UPDATED = "cch:cache:providers:updated"; const CACHE_TTL_MS = 30_000; // 30 seconds @@ -89,6 +93,12 @@ export async function publishProviderCacheInvalidation(): Promise { * @returns Provider 列表 */ export async function getCachedProviders(fetcher: () => Promise): Promise { + // 检查是否启用缓存(默认启用) + if (!ENABLE_PROVIDER_CACHE) { + logger.debug("[ProviderCache] Cache disabled, fetching from DB"); + return fetcher(); + } + // 确保订阅已初始化(异步,不阻塞) void ensureSubscription(); diff --git a/src/lib/config/env.schema.ts b/src/lib/config/env.schema.ts index ccaee2e33..fd9eaf74f 100644 --- a/src/lib/config/env.schema.ts +++ b/src/lib/config/env.schema.ts @@ -99,6 +99,10 @@ export const EnvSchema = z.object({ TZ: z.string().default("Asia/Shanghai"), ENABLE_MULTI_PROVIDER_TYPES: z.string().default("false").transform(booleanTransform), ENABLE_CIRCUIT_BREAKER_ON_NETWORK_ERRORS: z.string().default("false").transform(booleanTransform), + // 供应商缓存开关 + // - true (默认):启用进程级缓存,30s TTL,提升供应商查询性能 + // - false:禁用缓存,每次请求直接查询数据库 + ENABLE_PROVIDER_CACHE: z.string().default("true").transform(booleanTransform), MAX_RETRY_ATTEMPTS_DEFAULT: z.coerce .number() .min(1, "MAX_RETRY_ATTEMPTS_DEFAULT 不能小于 1")