feat(redis): use asyncio

This commit is contained in:
MingxuanGame
2025-07-31 14:38:10 +00:00
parent 1635641654
commit c5fc6afc18
9 changed files with 53 additions and 64 deletions

View File

@@ -22,7 +22,7 @@ from .api_router import router
from fastapi import Depends, HTTPException, Query
from httpx import HTTPError, HTTPStatusError
from pydantic import BaseModel
from redis import Redis
from redis.asyncio import Redis
import rosu_pp_py as rosu
from sqlmodel import col, select
from sqlmodel.ext.asyncio.session import AsyncSession
@@ -127,8 +127,8 @@ async def get_beatmap_attributes(
f"beatmap:{beatmap}:{ruleset}:"
f"{hashlib.md5(str(mods_).encode()).hexdigest()}:attributes"
)
if redis.exists(key):
return BeatmapAttributes.model_validate_json(redis.get(key)) # pyright: ignore[reportArgumentType]
if await redis.exists(key):
return BeatmapAttributes.model_validate_json(await redis.get(key)) # pyright: ignore[reportArgumentType]
try:
resp = await fetcher.get_or_fetch_beatmap_raw(redis, beatmap)
@@ -138,7 +138,7 @@ async def get_beatmap_attributes(
)
except rosu.ConvertError as e: # pyright: ignore[reportAttributeAccessIssue]
raise HTTPException(status_code=400, detail=str(e))
redis.set(key, attr.model_dump_json())
await redis.set(key, attr.model_dump_json())
return attr
except HTTPStatusError:
raise HTTPException(status_code=404, detail="Beatmap not found")

View File

@@ -6,7 +6,8 @@ from app.models.room import Room
from .api_router import router
from fastapi import Depends, HTTPException, Query
from fastapi import Depends, Query
from redis.asyncio import Redis
from sqlmodel import select
from sqlmodel.ext.asyncio.session import AsyncSession
@@ -19,17 +20,14 @@ async def get_all_rooms(
status: str = Query(None),
category: str = Query(None),
db: AsyncSession = Depends(get_db),
redis: Redis = Depends(get_redis),
):
all_room_ids = (await db.exec(select(RoomIndex).where(True))).all()
redis = get_redis()
roomsList: list[Room] = []
if redis:
for room_index in all_room_ids:
dumped_room = redis.get(str(room_index.id))
if dumped_room:
actual_room = Room.model_validate_json(str(dumped_room))
if actual_room.status == status and actual_room.category == category:
roomsList.append(actual_room)
return roomsList
else:
raise HTTPException(status_code=500, detail="Redis Error")
for room_index in all_room_ids:
dumped_room = await redis.get(str(room_index.id))
if dumped_room:
actual_room = Room.model_validate_json(str(dumped_room))
if actual_room.status == status and actual_room.category == category:
roomsList.append(actual_room)
return roomsList

View File

@@ -18,7 +18,7 @@ from .api_router import router
from fastapi import Depends, Form, HTTPException, Query
from pydantic import BaseModel
from redis import Redis
from redis.asyncio import Redis
from sqlalchemy.orm import joinedload
from sqlmodel import col, select
from sqlmodel.ext.asyncio.session import AsyncSession