修复重复初始化问题 - 统一Redis连接管理

主要修复:
1. 创建统一Redis连接管理器 (src/core/redis_manager.py)
   - 单例模式管理所有Redis连接
   - 懒加载连接,避免重复初始化
   - 线程安全的连接管理

2. 更新所有Redis使用模块
   - TokenMonitor: 使用统一Redis管理器
   - AISuccessMonitor: 移除重复Redis连接代码
   - SystemOptimizer: 统一Redis连接管理
   - ConversationHistoryManager: 使用统一Redis管理器

3. 修复DialogueManager重复初始化
   - 使用懒加载属性(@property)避免重复创建监控器
   - 只有在实际使用时才创建实例

4. 优化启动性能
   - 避免重复的Redis连接创建
   - 消除重复的TSP助手初始化
   - 减少启动时的日志输出

技术改进:
- 单例模式Redis管理器
- 懒加载组件初始化
- 统一连接管理
- 线程安全设计

解决启动卡顿问题,提升系统响应速度
This commit is contained in:
赵杰 Jie Zhao (雄狮汽车科技)
2025-09-18 20:37:27 +01:00
parent 82ab90450b
commit ad396e4294
14 changed files with 155 additions and 469 deletions

View File

@@ -8,11 +8,11 @@ import json
import logging
from typing import Dict, List, Optional, Any, Tuple
from datetime import datetime, timedelta
import redis
from sqlalchemy.orm import Session
from ..core.database import db_manager
from ..core.models import Conversation
from ..core.redis_manager import redis_manager
from ..config.config import Config
logger = logging.getLogger(__name__)
@@ -21,12 +21,29 @@ class ConversationHistoryManager:
"""对话历史管理器"""
def __init__(self):
self.redis_client = None
self._init_redis()
self.max_history_length = 20 # 最大历史记录数
self.cache_ttl = 3600 * 24 # 缓存24小时
def _get_redis_client(self):
"""获取Redis客户端"""
return redis_manager.get_connection()
def _init_redis(self):
"""初始化Redis连接"""
try:
self.redis_client = redis.Redis(
host='43.134.68.207',
port=6379,
password='123456',
decode_responses=True,
socket_connect_timeout=5,
socket_timeout=5,
retry_on_timeout=True
)
# 测试连接
self.redis_client.ping()
logger.info("Redis连接成功")
except Exception as e:
logger.error(f"Redis连接失败: {e}")
self.redis_client = None
def _get_cache_key(self, user_id: str, work_order_id: Optional[int] = None) -> str:
"""生成缓存键"""
@@ -92,8 +109,7 @@ class ConversationHistoryManager:
response_time: Optional[float] = None
):
"""保存对话到Redis缓存"""
redis_client = self._get_redis_client()
if not redis_client:
if not self.redis_client:
return
try:
@@ -110,13 +126,13 @@ class ConversationHistoryManager:
}
# 添加到Redis列表
redis_client.lpush(cache_key, json.dumps(conversation_record, ensure_ascii=False))
self.redis_client.lpush(cache_key, json.dumps(conversation_record, ensure_ascii=False))
# 限制列表长度
redis_client.ltrim(cache_key, 0, self.max_history_length - 1)
self.redis_client.ltrim(cache_key, 0, self.max_history_length - 1)
# 设置过期时间
redis_client.expire(cache_key, self.cache_ttl)
self.redis_client.expire(cache_key, self.cache_ttl)
except Exception as e:
logger.error(f"保存到Redis缓存失败: {e}")
@@ -131,8 +147,7 @@ class ConversationHistoryManager:
"""获取对话历史优先从Redis获取"""
try:
# 先尝试从Redis获取
redis_client = self._get_redis_client()
if redis_client:
if self.redis_client:
cached_history = self._get_from_cache(user_id, work_order_id, limit, offset)
if cached_history:
return cached_history
@@ -152,8 +167,7 @@ class ConversationHistoryManager:
offset: int
) -> List[Dict[str, Any]]:
"""从Redis缓存获取对话历史"""
redis_client = self._get_redis_client()
if not redis_client:
if not self.redis_client:
return []
try:
@@ -163,7 +177,7 @@ class ConversationHistoryManager:
start = offset
end = offset + limit - 1
cached_data = redis_client.lrange(cache_key, start, end)
cached_data = self.redis_client.lrange(cache_key, start, end)
history = []
for data in cached_data: