将核心模块按功能重新组织为更清晰的结构,包括 managers、handlers 和 utils 目录 添加完整的开发文档,涵盖快速开始、项目结构、核心概念和插件开发指南 更新所有相关模块的导入路径以匹配新的结构 将单例模式实现提取到单独的 singleton.py 文件
59 lines
1.8 KiB
Python
59 lines
1.8 KiB
Python
import redis.asyncio as redis
|
|
from ..config_loader import global_config as config
|
|
from ..utils.logger import logger
|
|
|
|
class RedisManager:
|
|
"""
|
|
Redis 连接管理器(异步单例)
|
|
"""
|
|
_instance = None
|
|
_redis = None
|
|
|
|
def __new__(cls):
|
|
if cls._instance is None:
|
|
cls._instance = super().__new__(cls)
|
|
return cls._instance
|
|
|
|
async def initialize(self):
|
|
"""
|
|
异步初始化 Redis 连接并进行健康检查
|
|
"""
|
|
if self._redis is None:
|
|
try:
|
|
host = config.redis['host']
|
|
port = config.redis['port']
|
|
db = config.redis['db']
|
|
password = config.redis.get('password')
|
|
|
|
logger.info(f"正在尝试连接 Redis: {host}:{port}, DB: {db}")
|
|
|
|
self._redis = redis.Redis(
|
|
host=host,
|
|
port=port,
|
|
db=db,
|
|
password=password,
|
|
decode_responses=True
|
|
)
|
|
if await self._redis.ping():
|
|
logger.success("Redis 连接成功!")
|
|
else:
|
|
logger.error("Redis 连接失败: PING 命令无响应")
|
|
except redis.exceptions.ConnectionError as e:
|
|
logger.error(f"Redis 连接失败: {e}")
|
|
self._redis = None
|
|
except Exception as e:
|
|
logger.exception(f"Redis 初始化时发生未知错误: {e}")
|
|
self._redis = None
|
|
|
|
@property
|
|
def redis(self):
|
|
"""
|
|
获取 Redis 连接实例
|
|
"""
|
|
if self._redis is None:
|
|
raise ConnectionError("Redis 未初始化或连接失败,请先调用 initialize()")
|
|
return self._redis
|
|
|
|
# 全局 Redis 管理器实例
|
|
redis_manager = RedisManager()
|