This commit is contained in:
薇薇安 2026-01-18 09:36:15 +08:00
parent b8a77eb18d
commit 0b11b72eb8
3 changed files with 47 additions and 15 deletions

View File

@ -16,5 +16,11 @@ python-binance==1.0.19
websocket-client==1.6.1 websocket-client==1.6.1
aiohttp==3.9.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 aioredis==2.0.1

View File

@ -7,18 +7,25 @@ from typing import Optional, Any, Dict, List
import ssl import ssl
try: try:
import aioredis # 使用 redis-py 4.2+ 的异步客户端(替代 aioredis
from aioredis import Redis import redis.asyncio as aioredis
AIOREDIS_AVAILABLE = True from redis.asyncio import Redis
REDIS_AVAILABLE = True
except ImportError as e: except ImportError as e:
AIOREDIS_AVAILABLE = False # 如果 redis.asyncio 不可用,尝试回退到 aioredis向后兼容
Redis = None try:
import sys import aioredis
import os from aioredis import Redis
# 保存导入错误信息,用于诊断 REDIS_AVAILABLE = True
_import_error = str(e) except ImportError:
_python_path = sys.executable REDIS_AVAILABLE = False
_python_version = sys.version Redis = None
import sys
import os
# 保存导入错误信息,用于诊断
_import_error = str(e)
_python_path = sys.executable
_python_version = sys.version
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -53,14 +60,14 @@ class RedisCache:
async def connect(self): async def connect(self):
"""连接 Redis""" """连接 Redis"""
if not AIOREDIS_AVAILABLE: if not REDIS_AVAILABLE:
import sys import sys
import os import os
logger.warning("aioredis 未安装,将使用内存缓存") logger.warning("redis 未安装,将使用内存缓存")
logger.debug(f" Python 路径: {sys.executable}") logger.debug(f" Python 路径: {sys.executable}")
logger.debug(f" Python 版本: {sys.version.split()[0]}") logger.debug(f" Python 版本: {sys.version.split()[0]}")
logger.debug(f" 导入错误: {_import_error if '_import_error' in globals() else '未知'}") 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.redis = None
self._connected = False self._connected = False
return return
@ -114,6 +121,20 @@ class RedisCache:
logger.info(f"URL 格式异常,使用独立的用户名和密码进行认证: {self.username}") logger.info(f"URL 格式异常,使用独立的用户名和密码进行认证: {self.username}")
# 创建 Redis 连接 # 创建 Redis 连接
# 使用 redis.asyncio.from_urlredis-py 4.2+)或 aioredis.from_url向后兼容
# redis-py 需要 decode_responses=Trueaioredis 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 = await aioredis.from_url(
self.redis_url, self.redis_url,
**connection_kwargs **connection_kwargs

View File

@ -8,4 +8,9 @@ pymysql==1.1.0
python-dotenv==1.0.0 python-dotenv==1.0.0
# Redis 缓存依赖 # 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 aioredis==2.0.1