redis_db.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import redis
  2. from core import get_logger, settings, DatabaseException
  3. logger = get_logger("database.redis")
  4. class RedisDatabaseHelper:
  5. _instance = None
  6. def __new__(cls):
  7. if not cls._instance:
  8. cls._instance = super(RedisDatabaseHelper, cls).__new__(cls)
  9. cls._instance._initialized = False
  10. return cls._instance
  11. def __init__(self):
  12. if self._initialized:
  13. return
  14. try:
  15. pool = redis.ConnectionPool(
  16. host=settings.redis_host,
  17. port=settings.redis_port,
  18. password=settings.redis_password,
  19. db=settings.redis_db,
  20. decode_responses=True,
  21. max_connections=50,
  22. )
  23. self.redis = redis.StrictRedis(connection_pool=pool)
  24. self.redis.ping()
  25. logger.info("Redis connection established", extra={"extra_data": {"host": settings.redis_host, "db": settings.redis_db}})
  26. except redis.ConnectionError as e:
  27. logger.error("Failed to connect to Redis", exc_info=True)
  28. raise DatabaseException(message="Redis连接失败", detail=str(e))
  29. self._initialized = True
  30. def check_connection(self) -> bool:
  31. """检查 Redis 连接是否正常"""
  32. try:
  33. self.redis.ping()
  34. return True
  35. except Exception:
  36. return False