From 0b11b72eb860369e984a59986b090e3a51a461dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=87=E8=96=87=E5=AE=89?= Date: Sun, 18 Jan 2026 09:36:15 +0800 Subject: [PATCH] a --- backend/requirements.txt | 8 +++++- trading_system/redis_cache.py | 49 +++++++++++++++++++++++---------- trading_system/requirements.txt | 5 ++++ 3 files changed, 47 insertions(+), 15 deletions(-) diff --git a/backend/requirements.txt b/backend/requirements.txt index 8cc7376..2cbf821 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -16,5 +16,11 @@ python-binance==1.0.19 websocket-client==1.6.1 aiohttp==3.9.1 -# Redis/Valkey 缓存依赖(与 trading_system 保持一致) +# Redis/Valkey 缓存依赖 +# redis-py 4.2+ 同时支持同步和异步客户端,可以替代aioredis +# - redis.Redis: 同步客户端(用于config_manager配置缓存) +# - redis.asyncio.Redis: 异步客户端(用于trading_system,可替代aioredis) +# 注意:如果只安装redis-py,可以同时满足同步和异步需求,无需aioredis +redis>=4.2.0 +# 保留aioredis作为备选(如果某些代码仍在使用aioredis接口) aioredis==2.0.1 diff --git a/trading_system/redis_cache.py b/trading_system/redis_cache.py index 9d2b220..5dc88a9 100644 --- a/trading_system/redis_cache.py +++ b/trading_system/redis_cache.py @@ -7,18 +7,25 @@ from typing import Optional, Any, Dict, List import ssl try: - import aioredis - from aioredis import Redis - AIOREDIS_AVAILABLE = True + # 使用 redis-py 4.2+ 的异步客户端(替代 aioredis) + import redis.asyncio as aioredis + from redis.asyncio import Redis + REDIS_AVAILABLE = True except ImportError as e: - AIOREDIS_AVAILABLE = False - Redis = None - import sys - import os - # 保存导入错误信息,用于诊断 - _import_error = str(e) - _python_path = sys.executable - _python_version = sys.version + # 如果 redis.asyncio 不可用,尝试回退到 aioredis(向后兼容) + try: + import aioredis + from aioredis import Redis + REDIS_AVAILABLE = True + except ImportError: + REDIS_AVAILABLE = False + Redis = None + import sys + import os + # 保存导入错误信息,用于诊断 + _import_error = str(e) + _python_path = sys.executable + _python_version = sys.version logger = logging.getLogger(__name__) @@ -53,14 +60,14 @@ class RedisCache: async def connect(self): """连接 Redis""" - if not AIOREDIS_AVAILABLE: + if not REDIS_AVAILABLE: import sys import os - logger.warning("aioredis 未安装,将使用内存缓存") + logger.warning("redis 未安装,将使用内存缓存") logger.debug(f" Python 路径: {sys.executable}") logger.debug(f" Python 版本: {sys.version.split()[0]}") logger.debug(f" 导入错误: {_import_error if '_import_error' in globals() else '未知'}") - logger.debug(f" 提示: 请运行 'pip install aioredis==2.0.1' 安装 aioredis") + logger.debug(f" 提示: 请运行 'pip install redis>=4.2.0' 安装 redis-py") self.redis = None self._connected = False return @@ -114,6 +121,20 @@ class RedisCache: logger.info(f"URL 格式异常,使用独立的用户名和密码进行认证: {self.username}") # 创建 Redis 连接 + # 使用 redis.asyncio.from_url(redis-py 4.2+)或 aioredis.from_url(向后兼容) + # redis-py 需要 decode_responses=True,aioredis 2.0 可能不需要 + # 检查是否是 redis.asyncio(通过检查模块名称) + try: + module_name = aioredis.__name__ if hasattr(aioredis, '__name__') else '' + is_redis_py = 'redis.asyncio' in module_name or 'redis' in module_name + except: + is_redis_py = False + + if is_redis_py: + # redis-py 4.2+ 的异步客户端,需要 decode_responses=True + connection_kwargs['decode_responses'] = True + # aioredis 2.0 不需要 decode_responses(它默认返回字节) + self.redis = await aioredis.from_url( self.redis_url, **connection_kwargs diff --git a/trading_system/requirements.txt b/trading_system/requirements.txt index f562601..b666dc3 100644 --- a/trading_system/requirements.txt +++ b/trading_system/requirements.txt @@ -8,4 +8,9 @@ pymysql==1.1.0 python-dotenv==1.0.0 # Redis 缓存依赖 +# redis-py 4.2+ 同时支持同步和异步客户端 +# - redis.Redis: 同步客户端(用于backend/config_manager) +# - redis.asyncio.Redis: 异步客户端(用于trading_system,替代aioredis) +redis>=4.2.0 +# 保留aioredis作为备选(向后兼容,如果某些代码仍在使用) aioredis==2.0.1