From 22a5af4ecbf2435e5fb39948aa7d9f6fdf79d377 Mon Sep 17 00:00:00 2001 From: Miyamizu-MitsuhaSang <2510681107@qq.com> Date: Sat, 30 Aug 2025 15:33:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0Redis=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/redis_test.py | 8 ++++++++ app/core/redis.py | 28 ++++++++++++++++++++-------- app/utils/security.py | 2 +- main.py | 14 ++++++++++---- 4 files changed, 39 insertions(+), 13 deletions(-) create mode 100644 app/api/redis_test.py diff --git a/app/api/redis_test.py b/app/api/redis_test.py new file mode 100644 index 0000000..be6363f --- /dev/null +++ b/app/api/redis_test.py @@ -0,0 +1,8 @@ +from fastapi import APIRouter +from app.core.redis import redis_client + +redis_test_router = APIRouter() + +@redis_test_router.get("/ping-redis") +async def ping_redis(): + return {"pong": await redis_client.ping()} diff --git a/app/core/redis.py b/app/core/redis.py index 3d725ac..fc9601e 100644 --- a/app/core/redis.py +++ b/app/core/redis.py @@ -1,18 +1,30 @@ import redis.asyncio as redis -from typing import AsyncGenerator +from typing import AsyncGenerator, Optional # 全局 Redis 客户端 -redis_client: redis.Redis +redis_client: Optional[redis.Redis] = None # 初始化 Redis(应用启动时调用) -async def init_redis_pool(): +async def init_redis(): global redis_client - redis_client = await redis.Redis( - host="localhost", - port=6379, - decode_responses=True, # 返回 str 而不是 Bytes - ) + if redis_client is None: + redis_client = await redis.Redis( + host="localhost", + port=6379, + decode_responses=True, # 返回 str 而不是 Bytes + ) + await redis_client.ping() + +async def close_redis(): + global redis_client + if redis_client: + try: + await redis_client.close() + except Exception: + pass + redis_client = None # FastAPI 依赖注入用的获取方法 async def get_redis() -> AsyncGenerator[redis.Redis, None]: + assert redis_client is not None, "Redis 未初始化" yield redis_client \ No newline at end of file diff --git a/app/utils/security.py b/app/utils/security.py index 5cf983f..0c2508f 100644 --- a/app/utils/security.py +++ b/app/utils/security.py @@ -12,7 +12,7 @@ from app.models.base import ReservedWords, User from settings import settings -redis_client = redis.Redis(host="localhost", port=6379, decode_responses=True) +redis_client = redis.Redis(host="127.0.0.1", port=6379, decode_responses=True) ALGORITHM = "HS256" diff --git a/main.py b/main.py index 19a972c..0eea4de 100644 --- a/main.py +++ b/main.py @@ -5,20 +5,24 @@ from fastapi.middleware.cors import CORSMiddleware import uvicorn from tortoise.contrib.fastapi import register_tortoise +from app.api.redis_test import redis_test_router from app.utils import redis_client from settings import TORTOISE_ORM from app.api.users import users_router from app.api.admin.router import admin_router from app.api.search import dict_search -from app.core.redis import init_redis_pool +from app.core.redis import init_redis, close_redis import app.models.signals @asynccontextmanager async def lifespan(app: FastAPI): - await init_redis_pool() - yield - await redis_client.close() # 清理资源 + # ---- startup ---- + await init_redis() + try: + yield + finally: + await close_redis() app = FastAPI(lifespan=lifespan) @@ -48,5 +52,7 @@ app.include_router(users_router, tags=["User API"], prefix="/users") app.include_router(admin_router, tags=["Administrator API"], prefix="/admin") app.include_router(dict_search, tags=["Dictionary Search API"]) +app.include_router(redis_test_router, tags=["Redis Test-Only API"]) + if __name__ == "__main__": uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True)