"""Singleton пул Redis-соединений. Один ConnectionPool на весь процесс — не создаём новое соединение на каждый запрос. Используем redis.asyncio для совместимости с FastAPI async endpoints. """ import redis.asyncio as aioredis from app.config import settings _pool: aioredis.ConnectionPool | None = None def get_pool() -> aioredis.ConnectionPool: """Инициализировать пул при первом вызове, затем возвращать тот же.""" global _pool if _pool is None: _pool = aioredis.ConnectionPool.from_url( settings.REDIS_URL, max_connections=50, decode_responses=True, ) return _pool def get_redis() -> aioredis.Redis: """Получить Redis клиент из пула (не создаёт новое TCP-соединение).""" return aioredis.Redis(connection_pool=get_pool()) async def close_pool() -> None: """Закрыть пул при остановке приложения.""" global _pool if _pool: await _pool.aclose() _pool = None