auto_trade_sys/docs/扫描结果缓存分析.md
薇薇安 c3a14f0f1a a
2026-01-25 16:53:40 +08:00

6.5 KiB
Raw Permalink Blame History

扫描结果缓存分析

问题描述

用户担心扫描结果缓存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}
TTL30秒当前或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. 重启交易进程

    supervisorctl restart auto_sys_acc1 auto_sys_acc2 auto_sys_acc3 auto_sys_acc4
    
  2. 验证优化

    # 查看日志,确认扫描结果缓存已禁用
    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秒
    • 观察多用户时系统是否稳定
    • 观察是否有超时警告