51 lines
1.8 KiB
Python
51 lines
1.8 KiB
Python
"""平台配置服务: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)
|