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