# 扫描结果缓存分析

## 问题描述

用户担心：扫描结果缓存（8个交易对）在不同账户间共享，可能导致账户B使用了账户A的过期缓存。

## 缓存层次分析

### 1. 可以共用的缓存（中间数据）

这些是**市场数据**，不依赖于账户配置，可以安全共用：

- **24小时行情数据缓存**：`ticker_24h:all`
  - TTL: 60秒
  - 所有账户共用
  - 这是市场原始数据，不依赖配置

- **K线数据缓存**：`klines:{symbol}:{interval}:{limit}`
  - TTL: 根据interval动态设置（1h=60秒，4h=300秒）
  - 所有账户共用
  - 这是市场原始数据，不依赖配置

- **技术指标计算结果缓存**：`indicators:{symbol}:{primary_interval}:{confirm_interval}`
  - TTL: 30秒
  - 所有账户共用
  - 这是基于K线计算的，不依赖配置

### 2. 扫描结果缓存（最终结果）

**缓存键**：`scan_result:top_symbols:{ns}`  
**TTL**：30秒（当前）或15秒（修改后）

**问题分析**：

#### 场景1：同一账户自己再用（30秒内）

- **账户A在T0时刻扫描**，缓存了8个交易对
- **账户A在T0+20秒再次扫描**，直接使用缓存
- **问题**：
  - 市场在变化，30秒内价格可能已经变化
  - 这8个交易对可能已经不适合了（价格可能已经触发止损/止盈）
  - 但是，如果配置相同，这8个交易对仍然是"当前市场最好的8个"

#### 场景2：不同账户共用缓存

- **账户A在T0时刻扫描**，缓存了8个交易对
- **账户B在T0+20秒扫描**，直接使用账户A的缓存
- **问题**：
  - 如果账户A和账户B的配置不同，这8个交易对可能不适合账户B
  - 即使配置相同，账户B也应该重新扫描，因为市场在变化

## 结论

### 扫描结果缓存不应该共用

**理由**：

1. **市场变化快**：30秒内价格可能已经变化，8个交易对可能已经不适合
2. **配置可能不同**：虽然现在使用全局配置，但未来可能不同账户有不同的配置
3. **扫描时间不同**：不同账户的扫描时间不同，不应该共用扫描结果

### 但是，中间数据可以共用

**理由**：

1. **市场数据不依赖配置**：24小时行情、K线数据、技术指标都是市场原始数据
2. **减少API请求**：多个账户共用这些缓存，可以显著减少API请求
3. **提升扫描效率**：扫描250个交易对时，如果每个账户都重新获取K线和计算技术指标，会很慢

## 解决方案

### 方案1：完全禁用扫描结果缓存（推荐）

**优点**：
- 每个账户都重新扫描，确保使用最新的市场数据
- 避免使用过期交易对的风险

**缺点**：
- 每个账户都需要重新扫描，耗时增加
- 但是，由于中间数据（K线、技术指标）已经缓存，重新扫描的耗时不会太长

### 方案2：缩短TTL并加入account_id区分（当前实现）

**优点**：
- 不同账户使用不同的缓存，避免配置不同的问题
- TTL缩短到15秒，减少使用过期数据的风险

**缺点**：
- 仍然存在使用过期数据的风险（15秒内市场可能已经变化）
- 增加了缓存键的复杂度

### 方案3：在缓存键中加入配置哈希值

**优点**：
- 如果配置不同，使用不同的缓存
- 如果配置相同，可以共用缓存

**缺点**：
- 实现复杂
- 仍然存在使用过期数据的风险

## 推荐方案

**推荐方案1：完全禁用扫描结果缓存** ✅ **已实施**

**理由**：
1. 扫描结果缓存的风险大于收益
2. 由于中间数据（K线、技术指标）已经缓存，重新扫描的耗时不会太长（约5-10秒）
3. 确保每个账户都使用最新的市场数据

**实现**：
- ✅ 移除扫描结果缓存逻辑
- ✅ 每个账户都重新扫描，但使用缓存的中间数据（K线、技术指标）

## 性能影响

### 禁用扫描结果缓存后的性能

**扫描250个交易对**：
- 获取24小时行情：1次API请求（缓存60秒，多个账户共用）✅
- 详细分析50-60个：50-60次K线API请求（有缓存，多个账户共用）✅
- 计算技术指标：50-60次计算（有缓存，多个账户共用）✅
- **总耗时**：约15-40秒（与之前相同，因为中间数据已经缓存）

**结论**：禁用扫描结果缓存后，性能影响很小，因为中间数据已经缓存。

---

## ✅ 已实施的优化（2026-01-25）

### 1. 禁用扫描结果缓存

**修改文件**：`trading_system/market_scanner.py`

**变更**：
- 移除了扫描结果缓存的读取逻辑
- 移除了扫描结果缓存的写入逻辑
- 每个账户都重新扫描，确保使用最新的市场数据

### 2. 优化多用户性能

**修改文件**：`trading_system/market_scanner.py`

**变更**：
- **降低并发数**：从5个并发降低到3个并发，确保多用户时系统稳定
- **添加超时控制**：单个交易对分析超时10秒，避免无限期阻塞
- **添加性能监控**：记录扫描耗时，如果超过60秒会发出警告

**效果**：
- 即使有多个账户同时扫描，也不会对系统造成过大压力
- 扫描过程不会错过或耽误处理
- 通过日志可以监控扫描性能

### 3. 性能监控

**新增功能**：
- 扫描完成后记录耗时
- 如果扫描耗时超过60秒，会发出警告
- 方便监控多用户时的系统压力

---

## 📊 多用户场景下的性能保证

### 优化前
- 并发数：5个
- 无超时控制
- 无性能监控

### 优化后
- 并发数：3个（降低系统压力）
- 超时控制：10秒（避免阻塞）
- 性能监控：记录耗时，超过60秒警告

### 预期效果

**单用户场景**：
- 扫描耗时：15-40秒
- 系统压力：低

**多用户场景（4个账户）**：
- 扫描耗时：15-40秒（每个账户）
- 系统压力：中等（由于中间数据缓存，实际API请求不会大幅增加）
- 不会错过或耽误处理：✅（超时控制确保不会无限期阻塞）

---

## 🚀 下一步操作

1. **重启交易进程**：
   ```bash
   supervisorctl restart auto_sys_acc1 auto_sys_acc2 auto_sys_acc3 auto_sys_acc4
   ```

2. **验证优化**：
   ```bash
   # 查看日志，确认扫描结果缓存已禁用
   tail -f /www/wwwroot/autosys_new/logs/trading_*.log | grep -E "开始扫描市场|扫描完成|扫描耗时"
   
   # 监控扫描性能
   tail -f /www/wwwroot/autosys_new/logs/trading_*.log | grep -E "扫描耗时|⚠️ 扫描耗时较长"
   ```

3. **观察效果**：
   - 观察扫描耗时是否在可接受范围内（15-40秒）
   - 观察多用户时系统是否稳定
   - 观察是否有超时警告
