You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

370 lines
11 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 缓存更新策略
## 一、概述
缓存更新策略是保证缓存数据与数据源数据一致性的关键。本策略定义了股票分析系统中各类数据的缓存更新机制包括实时行情、K线数据、板块动量等数据的更新频率、方式和流程。
## 二、数据分类
根据数据的特性和更新频率,将数据分为以下几类:
| 数据类型 | 更新频率 | 数据源 | 缓存策略 |
|---------|---------|---------|---------|
| 实时行情 | 高频30秒/次) | 东方财富/新浪/腾讯 | 主动更新 + 惰性更新 |
| K线数据 | 低频(每日/次) | 东方财富/新浪/腾讯 | 定时更新 + 按需更新 |
| 板块动量 | 中频1小时/次) | 计算生成 | 定时更新 |
| 市场统计 | 中频1小时/次) | 计算生成 | 定时更新 |
| 股票基本信息 | 低频(每周/次) | 数据源 | 定时更新 |
| 板块信息 | 低频(每周/次) | 数据源 | 定时更新 |
## 三、缓存更新策略
### 1. 实时行情更新策略
#### 更新频率
- **全市场数据**每30秒更新一次
- **单只股票**:按需更新(缓存未命中时)
#### 更新流程
1. **定时任务**每30秒执行一次
2. **数据获取**调用数据源API获取全市场实时行情
3. **数据处理**
- 解析API返回数据
- 标准化数据格式
- 计算涨跌幅、换手率等指标
4. **缓存更新**
- 更新全市场缓存:`realtime:full`
- 批量更新单只股票缓存:`realtime:stock:{code}`
- 更新ETF缓存`realtime:etf:{code}`
- 记录更新批次:`realtime:batch`
5. **数据库更新**:异步批量写入数据库
#### 缓存失效处理
- **时间过期**设置30分钟过期时间
- **主动失效**:数据更新时覆盖旧数据
- **降级策略**:缓存过期后,请求时触发更新
### 2. K线数据更新策略
#### 更新频率
- **历史数据**:每日收盘后更新
- **最近数据**:按需更新(缓存未命中时)
#### 更新流程
1. **定时任务**:每日收盘后执行
2. **数据获取**
- 调用数据源API获取当日K线数据
- 对于新上市股票,获取完整历史数据
3. **数据处理**
- 标准化数据格式
- 计算技术指标
4. **缓存更新**
- 更新K线缓存`kline:{code}:{period}:{days}`
- 更新压缩K线缓存`kline:compressed:{code}:{period}:{days}`
5. **数据库更新**:批量写入数据库
#### 缓存失效处理
- **时间过期**设置1天过期时间
- **主动失效**:每日更新时覆盖旧数据
- **按需更新**:缓存未命中时触发更新
### 3. 板块动量更新策略
#### 更新频率
- **常规更新**:每小时更新一次
- **特殊情况**:市场剧烈波动时增加更新频率
#### 更新流程
1. **定时任务**:每小时执行一次
2. **数据获取**
- 从缓存或数据库获取实时行情
- 获取板块成分股信息
3. **计算过程**
- 按涨跌幅排序取前16%作为动量个股
- 按板块分组,计算每个板块的动量值
- 计算动量值变化、排名变化
4. **缓存更新**
- 更新板块动量缓存:`sector:momentum:{period}:{sort}:{order}:{limit}`
- 更新板块成分股缓存:`sector:stocks:{sector_code}`
5. **数据库更新**:写入板块动量表
#### 缓存失效处理
- **时间过期**设置1小时过期时间
- **主动失效**:更新时覆盖旧数据
- **降级策略**:缓存过期后,请求时触发更新
### 4. 市场统计更新策略
#### 更新频率
- **常规更新**:每小时更新一次
- **特殊情况**:市场开盘和收盘时增加更新频率
#### 更新流程
1. **定时任务**:每小时执行一次
2. **数据获取**
- 从缓存或数据库获取实时行情
- 统计市场涨跌分布
3. **计算过程**
- 统计上涨、下跌、平盘家数
- 统计涨停、跌停家数
- 计算两市成交额
4. **缓存更新**
- 更新市场统计缓存:`market:stats`
- 更新涨跌分布缓存:`market:distribution`
5. **数据库更新**:写入市场统计表
#### 缓存失效处理
- **时间过期**设置1小时过期时间
- **主动失效**:更新时覆盖旧数据
- **降级策略**:缓存过期后,请求时触发更新
### 5. 股票基本信息更新策略
#### 更新频率
- **常规更新**:每周更新一次
- **特殊情况**:新股上市、股票退市时即时更新
#### 更新流程
1. **定时任务**:每周执行一次
2. **数据获取**
- 调用数据源API获取股票基本信息
- 处理新股上市、股票退市等情况
3. **数据处理**
- 标准化数据格式
- 关联板块信息
4. **缓存更新**
- 更新股票基本信息缓存
- 更新板块成分股缓存
5. **数据库更新**:批量写入数据库
#### 缓存失效处理
- **时间过期**设置7天过期时间
- **主动失效**:更新时覆盖旧数据
- **按需更新**:缓存未命中时触发更新
### 6. 板块信息更新策略
#### 更新频率
- **常规更新**:每周更新一次
- **特殊情况**:板块调整时即时更新
#### 更新流程
1. **定时任务**:每周执行一次
2. **数据获取**
- 调用数据源API获取板块信息
- 处理板块调整情况
3. **数据处理**
- 标准化数据格式
- 计算板块成分股数量
4. **缓存更新**
- 更新板块基本信息缓存:`sector:info:{sector_code}`
- 更新板块成分股缓存:`sector:stocks:{sector_code}`
5. **数据库更新**:批量写入数据库
#### 缓存失效处理
- **时间过期**设置7天过期时间
- **主动失效**:更新时覆盖旧数据
- **按需更新**:缓存未命中时触发更新
## 四、缓存预热策略
### 1. 服务启动预热
- **预热数据**
- 热门股票实时行情
- 主要指数数据
- 最近的板块动量数据
- 市场统计数据
- **预热流程**
1. 服务启动时触发
2. 并行获取各类数据
3. 写入Redis缓存
4. 记录预热完成时间
### 2. 定时预热
- **预热频率**:每小时执行一次
- **预热数据**
- 即将到期的缓存
- 预测可能会被访问的数据
- 计算密集型数据
- **预热流程**
1. 定时任务触发
2. 分析缓存使用情况
3. 预测热门数据
4. 提前计算并缓存
### 3. 智能预热
- **基于访问模式**
- 分析历史访问记录
- 预测未来访问模式
- 提前缓存可能被访问的数据
- **基于市场事件**
- 市场开盘前预热
- 重大新闻发布后预热
- 财报季预热相关股票数据
## 五、缓存一致性保障
### 1. 数据一致性策略
- **最终一致性**
- 优先保证系统可用性
- 允许短暂的数据不一致
- 通过定期同步保证最终一致
- **强一致性**
- 对关键数据采用强一致性
- 使用分布式锁确保数据一致性
- 双写模式:同时更新数据库和缓存
### 2. 一致性实现
- **先更新数据库,后更新缓存**
1. 开始事务
2. 更新数据库
3. 提交事务
4. 更新缓存
5. 释放锁
- **缓存标记失效**
1. 更新数据库
2. 标记缓存失效
3. 下次读取时更新缓存
- **定期全量同步**
- 每日执行全量同步
- 验证缓存与数据库一致性
- 修复不一致数据
### 3. 并发控制
- **分布式锁**
- 使用Redis实现分布式锁
- 避免并发更新导致的数据不一致
- **乐观锁**
- 使用版本号或时间戳
- 检测并发冲突
- **队列处理**
- 将更新操作放入队列
- 串行处理确保顺序
## 六、缓存监控与告警
### 1. 监控指标
| 指标 | 描述 | 阈值 | 告警级别 |
|------|------|------|---------|
| 缓存命中率 | 缓存命中次数/总请求次数 | <80% | 警告 |
| 缓存更新延迟 | 数据更新到缓存的延迟 | >5秒 | 警告 |
| 缓存过期率 | 过期缓存占比 | >50% | 警告 |
| 缓存写入失败率 | 缓存写入失败次数/总写入次数 | >1% | 严重 |
| 缓存读取失败率 | 缓存读取失败次数/总读取次数 | >1% | 严重 |
### 2. 告警策略
- **缓存命中率低**
- 检查缓存策略是否合理
- 增加缓存预热
- 调整缓存过期时间
- **缓存更新延迟高**
- 检查数据源API响应时间
- 优化数据处理逻辑
- 增加更新线程数
- **缓存写入失败**
- 检查Redis连接状态
- 检查Redis内存使用情况
- 重启Redis服务
- **缓存读取失败**
- 检查Redis连接状态
- 检查网络连接
- 降级到数据库读取
### 3. 监控工具
- **Prometheus**:收集缓存相关指标
- **Grafana**:可视化缓存监控面板
- **Redis Exporter**导出Redis指标
- **Alertmanager**:处理告警
## 七、异常处理
### 1. 数据源异常
- **处理策略**
- 切换到备用数据源
- 使用缓存数据作为降级方案
- 记录异常并告警
- **恢复策略**
- 定期检查数据源状态
- 自动恢复到主数据源
- 验证数据一致性
### 2. Redis异常
- **处理策略**
- 降级到数据库读取
- 记录异常并告警
- 尝试重新连接
- **恢复策略**
- 监控Redis状态
- 自动恢复缓存
- 验证数据一致性
### 3. 数据库异常
- **处理策略**
- 继续使用缓存数据
- 记录异常并告警
- 尝试重新连接
- **恢复策略**
- 监控数据库状态
- 自动恢复数据同步
- 验证数据一致性
## 八、性能优化
### 1. 批量操作
- **批量读取**
- 使用MGET、HMGET等批量命令
- 减少网络往返次数
- **批量写入**
- 使用Pipeline批量执行命令
- 减少网络开销
### 2. 数据压缩
- **K线数据**
- 使用MsgPack或Protocol Buffers压缩
- 减少存储空间和网络传输
- **全量实时数据**
- 使用GZIP压缩
- 减少内存使用
### 3. 并发处理
- **多线程更新**
- 使用线程池并行处理数据
- 提高更新效率
- **异步更新**
- 使用消息队列异步处理
- 避免阻塞主线程
### 4. 缓存分层
- **热点数据**
- 存储在Redis中
- 高频访问
- **冷数据**
- 存储在数据库中
- 低频访问
- **预热数据**
- 提前计算并缓存
- 减少请求时计算开销
## 九、总结
缓存更新策略是保证股票分析系统性能和数据一致性的关键。通过合理的更新频率、流程和监控,可以确保缓存数据的及时性和准确性,同时提高系统的响应速度和可靠性。
本策略采用了多种技术手段,包括定时更新、按需更新、缓存预热、一致性保障等,以应对不同类型数据的更新需求。同时,通过监控和异常处理,确保系统在面对各种异常情况时能够稳定运行。
随着系统的发展和数据量的增长,缓存更新策略也需要不断优化和调整,以适应新的业务需求和技术挑战。