# 数据存储与缓存策略 ## 1. 缓存服务 (Redis + MySQL) ### 代码位置 - **文件**:`backend/src/services/cacheService.ts` - **核心方法**: - `set(key, value, options)`: 写入Redis缓存 - `saveToMySQL(symbol, type, data)`: 写入MySQL数据库 ### 写入场景 1. **数据首次获取**: - 当从数据源获取新数据时,会同时写入Redis和MySQL - 代码路径:`cacheService.get()` → 数据源获取 → `set()` + `saveToMySQL()` 2. **MySQL数据同步到Redis**: - 当从MySQL获取数据时,会将数据同步到Redis - 代码路径:`cacheService.get()` → MySQL获取 → `set()` ## 2. 市场服务 (使用缓存服务) ### 代码位置 - **文件**:`backend/src/services/marketService.ts` ### 写入场景 1. **市场概览数据**: - 方法:`fetchMarketOverview()` - 缓存键:`market:overview` - 过期时间:5分钟 2. **品种详情数据**: - 方法:`fetchMarketDetail(symbol)` - 缓存键:`market:detail:{symbol}` - 过期时间:5分钟 3. **K线数据**: - 方法:`fetchKlineData(symbol, period)` - 缓存键:`market:kline:{symbol}:{period}` - 过期时间:10分钟 4. **市场热点数据**: - 方法:`fetchMarketHotspots()` - 缓存键:`market:hotspots` - 过期时间:5分钟 ## 3. Python服务数据存储 (SQLite) ### 代码位置 - **文件**:`backend/service_implementation/qihuo_analyzer/data/data_storage.py` ### 写入场景 1. **分析结果**: - 方法:`save_analysis_result(result)` - 表:`analysis_results` - 场景:当AI分析完成后保存分析结果 2. **K线数据**: - 方法:`save_kline_data(symbol, duration, df)` - 表:`kline_data` - 场景:当获取K线数据后保存到数据库 3. **交易建议**: - 方法:`save_trade_recommendation(recommendation)` - 表:`trade_recommendations` - 场景:当生成交易建议后保存 4. **风险监控数据**: - 方法:`save_risk_monitoring(monitoring_data)` - 表:`risk_monitoring` - 场景:当监控交易风险时保存 ## 4. Flask API服务 (调用Python存储) ### 代码位置 - **文件**:`backend/service_implementation/service/app.py` ### 写入场景 1. **K线数据**: - 路径:`/api/kline` - 代码:当数据库中没有K线数据时,从数据源获取并保存 - 调用:`data_storage.save_kline_data()` 2. **分析结果**: - 路径:`/api/analyze` - 代码:当AI分析完成后保存分析结果 - 调用:`data_storage.save_analysis_result()` 3. **风险监控数据**: - 路径:`/api/risk` - 代码:当监控交易风险时保存 - 调用:`data_storage.save_risk_monitoring()` ## 5. 数据流动路径 ### 前端 → 后端 API → 缓存服务 → 数据源 1. 前端请求数据 2. 后端API调用市场服务 3. 市场服务调用缓存服务 4. 缓存服务按优先级获取数据: - Redis → MySQL → 数据源 5. 如果从数据源获取数据,同步写入MySQL和Redis ### Python服务内部 1. Flask API接收请求 2. 调用数据获取器获取数据 3. 将数据保存到SQLite数据库 4. 返回数据给前端 ## 6. 缓存策略 - **Redis**:短期缓存,用于高频访问数据 - 市场概览:5分钟 - 品种详情:5分钟 - K线数据:10分钟 - 市场热点:5分钟 - **MySQL**:持久化存储,用于长期数据 - 存储所有从数据源获取的数据 - **SQLite**:Python服务本地存储 - 存储分析结果、K线数据、交易建议、风险监控数据 这种多层缓存策略确保了数据的快速访问和持久化存储,同时减少了对外部数据源的请求频率。