소스 검색

优化启动逻辑

liujintao 1 개월 전
부모
커밋
f468f3888a
2개의 변경된 파일17개의 추가작업 그리고 3개의 파일을 삭제
  1. 16 2
      app/main.py
  2. 1 1
      app/services/cache.py

+ 16 - 2
app/main.py

@@ -24,8 +24,10 @@ from app.services.cache import (
     wait_cache_ready,
 )
 from app.services.redis_client import (
+    KEY_CACHE_DATA,
     KEY_LOCK_LEADER,
     close_redis,
+    get_redis,
     release_lock,
 )
 
@@ -43,8 +45,20 @@ async def lifespan(app: FastAPI) -> AsyncIterator[None]:
     tasks: list[asyncio.Task[None]] = []
 
     if is_leader:
-        logger.info("[%s] 当选 leader,开始首次刷新", WORKER_ID)
-        await refresh_cache()
+        # Redis 已有缓存就跳过启动刷新;只让定时任务在配置时间触发
+        cache_exists = False
+        try:
+            r = await get_redis()
+            cache_exists = bool(await r.exists(KEY_CACHE_DATA))
+        except Exception as exc:  # noqa: BLE001
+            logger.warning("[%s] 检查 Redis 缓存失败,将执行首次刷新: %s", WORKER_ID, exc)
+
+        if cache_exists:
+            logger.info("[%s] 当选 leader,Redis 已有缓存,跳过启动刷新", WORKER_ID)
+        else:
+            logger.info("[%s] 当选 leader,Redis 无缓存,执行首次刷新", WORKER_ID)
+            await refresh_cache()
+
         tasks.append(
             asyncio.create_task(scheduler_loop(), name="faq-scheduler")
         )

+ 1 - 1
app/services/cache.py

@@ -125,9 +125,9 @@ async def refresh_cache(force: bool = False) -> bool:
             await release_lock(KEY_LOCK_REFRESH, WORKER_ID)
 
 
-# ===== Leader 选举与心跳 =====
 
 
+# ===== Leader 选举与心跳 =====
 async def try_become_leader() -> bool:
     """尝试成为 leader(仅一个 worker 会成功)。"""
     try: