Files
video/server/build/lib/app/services/config_service.py
T
2026-10-16 13:51:00 +08:00

51 lines
1.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""平台配置服务:system_configs 表 + Redis 缓存 60s(后台修改即时生效)"""
from typing import Any
import redis.asyncio as aioredis
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from app.models.common import SystemConfig
CACHE_KEY = "config:system"
CACHE_TTL = 60
async def get_all_configs(db: AsyncSession, redis: aioredis.Redis) -> dict[str, str]:
"""全量读取配置(Redis Hash 缓存 60s)"""
cached = await redis.hgetall(CACHE_KEY) # type: ignore[misc]
if cached:
return dict(cached)
rows = (await db.execute(select(SystemConfig))).scalars().all()
configs = {row.config_key: row.config_value for row in rows}
if configs:
await redis.hset(CACHE_KEY, mapping=configs) # type: ignore[misc]
await redis.expire(CACHE_KEY, CACHE_TTL)
return configs
async def get_config(db: AsyncSession, redis: aioredis.Redis, key: str, default: Any = None) -> str | Any:
"""读取单个配置项"""
configs = await get_all_configs(db, redis)
return configs.get(key, default)
async def get_config_int(db: AsyncSession, redis: aioredis.Redis, key: str, default: int) -> int:
value = await get_config(db, redis, key, None)
try:
return int(value) if value is not None else default
except (TypeError, ValueError):
return default
async def set_config(db: AsyncSession, redis: aioredis.Redis, key: str, value: str, admin_id: int | None = None) -> None:
"""写入配置并失效缓存(后台调用)"""
row = await db.get(SystemConfig, key)
if row is None:
db.add(SystemConfig(config_key=key, config_value=value, updated_by=admin_id))
else:
row.config_value = value
row.updated_by = admin_id
await db.commit()
await redis.delete(CACHE_KEY)