Coverage for infrastructure/database/trade_redis_client.py: 0.00%
99 statements
« prev ^ index » next coverage.py v7.10.7, created at 2025-10-13 18:58 +0000
« prev ^ index » next coverage.py v7.10.7, created at 2025-10-13 18:58 +0000
1"""
2Trade模块的Redis客户端
3"""
5import json
6import os
7from typing import Any, Optional
9import redis
10from dotenv import load_dotenv
12# 加载项目根目录的环境变量
13load_dotenv()
16class TradeRedisClient:
17 """交易模块Redis客户端"""
19 def __init__(self):
20 """初始化Redis连接"""
21 self.redis_host = os.getenv("REDIS_HOST", "localhost")
22 self.redis_port = int(os.getenv("REDIS_PORT", 6379))
23 self.redis_db = int(os.getenv("REDIS_DB", 1)) # 使用数据库1
24 self.redis_password = os.getenv("REDIS_PASSWORD", "")
26 try:
27 if self.redis_password:
28 self.client = redis.Redis(
29 host=self.redis_host,
30 port=self.redis_port,
31 db=self.redis_db,
32 password=self.redis_password,
33 decode_responses=True,
34 )
35 else:
36 self.client = redis.Redis(
37 host=self.redis_host,
38 port=self.redis_port,
39 db=self.redis_db,
40 decode_responses=True,
41 )
43 # 测试连接
44 self.client.ping()
45 print(
46 f"✅ Trade Redis连接成功: {self.redis_host}:{self.redis_port} (DB: {self.redis_db})"
47 )
49 except Exception as e:
50 print(f"❌ Trade Redis连接失败: {e}")
51 self.client = None
53 def is_connected(self) -> bool:
54 """检查Redis连接状态"""
55 if not self.client:
56 return False
57 try:
58 self.client.ping()
59 return True
60 except:
61 return False
63 def set_trading_data(
64 self, key: str, data: Any, expire: Optional[int] = None
65 ) -> bool:
66 """设置交易数据"""
67 if not self.is_connected():
68 return False
70 try:
71 if isinstance(data, (dict, list)):
72 data = json.dumps(data, ensure_ascii=False)
74 if expire:
75 return self.client.setex(key, expire, data)
76 else:
77 return self.client.set(key, data)
78 except Exception as e:
79 print(f"Trade Redis SET错误: {e}")
80 return False
82 def get_trading_data(self, key: str) -> Optional[Any]:
83 """获取交易数据"""
84 if not self.is_connected():
85 return None
87 try:
88 value = self.client.get(key)
89 if value is None:
90 return None
92 try:
93 return json.loads(value)
94 except:
95 return value
96 except Exception as e:
97 print(f"Trade Redis GET错误: {e}")
98 return None
100 def set_market_data(self, symbol: str, data: dict, expire: int = 300) -> bool:
101 """设置市场数据(5分钟过期)"""
102 key = f"market:{symbol}"
103 return self.set_trading_data(key, data, expire)
105 def get_market_data(self, symbol: str) -> Optional[dict]:
106 """获取市场数据"""
107 key = f"market:{symbol}"
108 return self.get_trading_data(key)
110 def set_position(self, account_id: str, position_data: dict) -> bool:
111 """设置持仓数据"""
112 key = f"position:{account_id}"
113 return self.set_trading_data(key, position_data)
115 def get_position(self, account_id: str) -> Optional[dict]:
116 """获取持仓数据"""
117 key = f"position:{account_id}"
118 return self.get_trading_data(key)
120 def set_order(self, order_id: str, order_data: dict, expire: int = 3600) -> bool:
121 """设置订单数据(1小时过期)"""
122 key = f"order:{order_id}"
123 return self.set_trading_data(key, order_data, expire)
125 def get_order(self, order_id: str) -> Optional[dict]:
126 """获取订单数据"""
127 key = f"order:{order_id}"
128 return self.get_trading_data(key)
130 def delete_order(self, order_id: str) -> bool:
131 """删除订单数据"""
132 if not self.is_connected():
133 return False
135 try:
136 key = f"order:{order_id}"
137 return bool(self.client.delete(key))
138 except Exception as e:
139 print(f"Trade Redis DELETE错误: {e}")
140 return False
142 def get_all_orders(self) -> list:
143 """获取所有订单"""
144 if not self.is_connected():
145 return []
147 try:
148 keys = self.client.keys("order:*")
149 orders = []
150 for key in keys:
151 order_data = self.get_trading_data(key)
152 if order_data:
153 orders.append(order_data)
154 return orders
155 except Exception as e:
156 print(f"Trade Redis GET ALL ORDERS错误: {e}")
157 return []
160# 全局交易Redis客户端实例
161trade_redis_client = TradeRedisClient()
164def get_trade_redis() -> TradeRedisClient:
165 """获取交易Redis客户端实例"""
166 return trade_redis_client