redis_client.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. """共享 Redis 客户端(同步:会话鉴权;异步:API 加密 nonce)。"""
  2. from __future__ import annotations
  3. from typing import Optional
  4. import redis
  5. import redis.asyncio as aioredis
  6. from app.core.config import settings
  7. _sync_redis_client: Optional[redis.Redis] = None
  8. _async_redis_client: Optional[aioredis.Redis] = None
  9. def redis_enabled() -> bool:
  10. return bool(settings.REDIS_HOST)
  11. def _redis_common_kwargs() -> dict:
  12. return {
  13. "host": settings.REDIS_HOST,
  14. "port": settings.REDIS_PORT,
  15. "db": settings.REDIS_DB,
  16. "password": settings.REDIS_PASSWORD or None,
  17. "socket_timeout": settings.REDIS_TIMEOUT_SEC,
  18. "socket_connect_timeout": settings.REDIS_CONNECT_TIMEOUT_SEC,
  19. "ssl": settings.REDIS_SSL_ENABLED,
  20. "decode_responses": True,
  21. }
  22. def get_sync_redis_client() -> Optional[redis.Redis]:
  23. """同步 Redis(auth 会话等,在线程池中调用)。"""
  24. global _sync_redis_client
  25. if not redis_enabled():
  26. return None
  27. if _sync_redis_client is None:
  28. _sync_redis_client = redis.Redis(
  29. **_redis_common_kwargs(),
  30. health_check_interval=settings.REDIS_HEALTH_CHECK_INTERVAL_SEC,
  31. )
  32. return _sync_redis_client
  33. def get_redis_client() -> Optional[aioredis.Redis]:
  34. """异步 Redis(API 加密 nonce 等中间件)。"""
  35. global _async_redis_client
  36. if not redis_enabled():
  37. return None
  38. if _async_redis_client is None:
  39. _async_redis_client = aioredis.Redis(
  40. **_redis_common_kwargs(),
  41. health_check_interval=settings.REDIS_HEALTH_CHECK_INTERVAL_SEC,
  42. )
  43. return _async_redis_client