|
|
# 缓存更新策略
|
|
|
|
|
|
## 一、概述
|
|
|
|
|
|
缓存更新策略是保证缓存数据与数据源数据一致性的关键。本策略定义了股票分析系统中各类数据的缓存更新机制,包括实时行情、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中
|
|
|
- 高频访问
|
|
|
- **冷数据**:
|
|
|
- 存储在数据库中
|
|
|
- 低频访问
|
|
|
- **预热数据**:
|
|
|
- 提前计算并缓存
|
|
|
- 减少请求时计算开销
|
|
|
|
|
|
## 九、总结
|
|
|
|
|
|
缓存更新策略是保证股票分析系统性能和数据一致性的关键。通过合理的更新频率、流程和监控,可以确保缓存数据的及时性和准确性,同时提高系统的响应速度和可靠性。
|
|
|
|
|
|
本策略采用了多种技术手段,包括定时更新、按需更新、缓存预热、一致性保障等,以应对不同类型数据的更新需求。同时,通过监控和异常处理,确保系统在面对各种异常情况时能够稳定运行。
|
|
|
|
|
|
随着系统的发展和数据量的增长,缓存更新策略也需要不断优化和调整,以适应新的业务需求和技术挑战。 |