"""MySQL / Redis 连接工厂。""" from functools import lru_cache import redis from sqlalchemy import create_engine from sqlalchemy.engine import Engine from app.config.settings import settings def _mysql_url(database: str) -> str: pwd = settings.mysql_password auth = f"{settings.mysql_user}:{pwd}" if pwd else settings.mysql_user return ( f"mysql+pymysql://{auth}@{settings.mysql_host}:{settings.mysql_port}" f"/{database}?charset=utf8mb4" ) @lru_cache def get_agent_engine() -> Engine: return create_engine(_mysql_url(settings.mysql_database), pool_pre_ping=True) @lru_cache def get_core_engine() -> Engine: return create_engine(_mysql_url(settings.mysql_core_database), pool_pre_ping=True) def _redis_kwargs() -> dict: """RESP2:兼容 Windows Redis 3.x(无 HELLO);Redis 7 Docker 同样可用。""" return { "decode_responses": True, "protocol": 2, "socket_timeout": 1, "socket_connect_timeout": 0.5, } @lru_cache def get_redis_client() -> redis.Redis: """Redis 单例客户端(客服线 VisitorMemory / ProfileHotCache 用)。""" return redis.from_url(settings.redis_url, **_redis_kwargs())