feat(cache): 新增 store-factory(CACHE_DRIVER 切换)
This commit is contained in:
36
src/shared/lib/cache/store-factory.ts
vendored
Normal file
36
src/shared/lib/cache/store-factory.ts
vendored
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
import "server-only"
|
||||||
|
|
||||||
|
import { env } from "@/env.mjs"
|
||||||
|
|
||||||
|
import type { CacheStore } from "./types"
|
||||||
|
import { MemoryCacheStore } from "./memory-store"
|
||||||
|
|
||||||
|
let singleton: CacheStore | null = null
|
||||||
|
let loadPromise: Promise<CacheStore> | null = null
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前进程的 CacheStore 实例。
|
||||||
|
*
|
||||||
|
* - 默认返回 MemoryCacheStore
|
||||||
|
* - 当 CACHE_DRIVER=redis 时动态加载 RedisCacheStore
|
||||||
|
* - Redis 实现懒加载 @upstash/redis 依赖,未安装时首次调用抛错
|
||||||
|
*
|
||||||
|
* 返回 Promise:Redis 实现需动态 import 模块,故为异步。
|
||||||
|
*/
|
||||||
|
export async function getCacheStore(): Promise<CacheStore> {
|
||||||
|
if (singleton) return singleton
|
||||||
|
if (loadPromise) return loadPromise
|
||||||
|
|
||||||
|
loadPromise = (async () => {
|
||||||
|
if (env.CACHE_DRIVER === "redis") {
|
||||||
|
const { RedisCacheStore } = await import("./redis-store")
|
||||||
|
singleton = new RedisCacheStore()
|
||||||
|
} else {
|
||||||
|
singleton = new MemoryCacheStore()
|
||||||
|
}
|
||||||
|
loadPromise = null
|
||||||
|
return singleton
|
||||||
|
})()
|
||||||
|
|
||||||
|
return loadPromise
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user