缓存策略
**本文引用的文件** - [[bi-common/cache/redisx/client.go]](../file/bi-common/cache/redisx/client.go) - [[bi-common/cache/redisx/config.go]](../file/bi-common/cache/redisx/config.go) - [[bi-common/cache/redisx/option.go]](../file/bi-common/cache/redisx/option.go) - [[bi-common/cache/redisx/env.go]](../file/bi-common/cache/redisx/env.go) - [[bi-common/cache/redisx/setup.go]](../file/bi-common/cache/redisx/setup.go) - [[bi-common/cache/redisx/redisx-default.yaml]](../file/bi-common/cache/redisx/redisx-default.yaml) - [[bi-common/observability/metrics/metrics.go]](../file/bi-common/observability/metrics/metrics.go) - [[bi-chat/docs/memory_architecture.md]](../file/bi-chat/docs/memory-architecture.md) - [[mcp-server-starrocks/src/mcp_server_starrocks/db_summary_manager.py]](../file/mcp-server-starrocks/src/mcp-server-starrocks/db-summary-manager.py) - [[bi-common/conf/common.pb.go]](../file/bi-common/conf/common.pb.go) - [[bi-basic/app/service/internal/conf/conf.pb.go]](../file/bi-basic/app/service/internal/conf/conf.pb.go) - [[bi-notify/internal/conf/conf.pb.go]](../file/bi-notify/internal/conf/conf.pb.go)
目录
简介
本文件面向BI分析平台的缓存策略,聚焦Redis在系统中的应用与架构设计,覆盖键值设计原则、穿透/击穿/雪崩防护、分布式一致性与更新策略、性能优化(连接池与内存)、热点识别与预热、与数据库的双写一致性、最佳实践与常见陷阱,以及监控指标与故障排除方法。内容基于仓库内实际代码与文档进行梳理与总结。
项目结构
Redis相关能力主要由通用模块提供,包括配置、客户端封装、环境变量加载、默认配置文件与统一初始化流程;同时在聊天与向量化检索等场景中存在缓存使用示例与策略文档;观测侧提供缓存命中/未命中/耗时等指标埋点。
图表来源
- [bi-common/cache/redisx/config.go]
- [bi-common/cache/redisx/option.go]
- [bi-common/cache/redisx/env.go]
- [bi-common/cache/redisx/client.go]
- [bi-common/cache/redisx/setup.go]
- [bi-common/cache/redisx/redisx-default.yaml]
- [bi-common/observability/metrics/metrics.go]
- [bi-chat/docs/memory_architecture.md]
- [mcp-server-starrocks/src/mcp_server_starrocks/db_summary_manager.py]
章节来源
- [bi-common/cache/redisx/config.go]
- [bi-common/cache/redisx/option.go]
- [bi-common/cache/redisx/env.go]
- [bi-common/cache/redisx/client.go]
- [bi-common/cache/redisx/setup.go]
- [bi-common/cache/redisx/redisx-default.yaml]
- [bi-common/observability/metrics/metrics.go]
- [bi-chat/docs/memory_architecture.md]
- [mcp-server-starrocks/src/mcp_server_starrocks/db_summary_manager.py]
核心组件
- 配置与选项
- Config:集中定义连接模式、地址、认证、协议、重试、哨兵/集群路由、连接池、超时、TLS与Dialer等。
- Option:以函数式选项对Config进行增量修改,便于组合与复用。
- 默认配置文件与环境变量加载:提供开箱即用的默认值,并允许通过环境变量覆盖。
- 客户端封装
- Client:统一封装单机/哨兵/集群三种模式的客户端创建、Ping健康检查、TLS构建、Close与底层UniversalClient暴露。
- 初始化流程
- Setup:将配置结构体转换为选项并创建客户端,支持兼容旧版字段,提供Ping校验与错误返回。
- 观测与指标
- 提供缓存命中、未命中与操作耗时等Prometheus指标,便于监控与告警。
章节来源
- [bi-common/cache/redisx/config.go]
- [bi-common/cache/redisx/option.go]
- [bi-common/cache/redisx/env.go]
- [bi-common/cache/redisx/client.go]
- [bi-common/cache/redisx/setup.go]
- [bi-common/observability/metrics/metrics.go]
架构总览
Redis在BI平台中的角色:
- 作为高性能KV存储,承载LLM响应缓存、向量检索缓存、统计数据缓存等。
- 通过统一的Client封装与配置体系,支持单机、哨兵与集群部署形态。
- 结合业务侧的缓存策略(TTL、强制刷新、降级)与观测指标,保障稳定性与可观测性。
图表来源
- [bi-common/cache/redisx/client.go]
- [bi-chat/docs/memory_architecture.md]
- [mcp-server-starrocks/src/mcp_server_starrocks/db_summary_manager.py]
- [bi-common/observability/metrics/metrics.go]
组件详解
Redis客户端与配置体系
- 模式选择
- single/sentinel/cluster三类模式通过Config.Mode与createClient分支实现,分别映射到go-redis的单机、哨兵与集群客户端。
- 连接池与超时
- 支持PoolSize、MinIdleConns、MaxIdleConns、PoolTimeout、ConnMaxIdleTime、ConnMaxLifetime等参数,结合Dial/Read/Write超时控制网络行为。
- TLS与认证
- 支持用户名/密码认证、TLS启用、CA/客户端证书加载与SNI配置。
- 环境变量与默认值
- 通过LoadFromEnv与redisx-default.yaml提供灵活的运行时配置注入与默认值保障。
图表来源
- [bi-common/cache/redisx/config.go]
- [bi-common/cache/redisx/config.go]
- [bi-common/cache/redisx/client.go]
章节来源
- [bi-common/cache/redisx/config.go]
- [bi-common/cache/redisx/config.go]
- [bi-common/cache/redisx/option.go]
- [bi-common/cache/redisx/env.go]
- [bi-common/cache/redisx/client.go]
初始化与配置转换
- Setup将配置结构体转换为Option并创建客户端,兼容旧版字段(如单地址),并在创建后执行Ping以验证连通性。
- convertProtoToOptions演示了如何将proto配置映射为选项,便于在不同模块间共享配置结构。
图表来源
章节来源
缓存键值设计与过期策略
- 命名规范
- 前缀区分用途(如 llm:模型名、vector、stat等),路径化组织,避免冲突。
- 参数拼接采用稳定、可读的键名,必要时对输入做哈希以限制长度。
- 过期策略
- LLM缓存:较长TTL(如24小时),适合重复查询的稳定输出。
- 统计数据缓存:支持强制刷新,TTL适中(如1小时),满足用户主动刷新需求。
- 向量检索缓存:命中后直接返回,降低延迟。
- 降级与容错
- 缓存异常不阻断主流程,捕获异常后直接走下游计算。
图表来源
- [bi-chat/docs/memory_architecture.md]
- [bi-chat/docs/memory_architecture.md]
- [bi-chat/docs/memory_architecture.md]
章节来源
- [bi-chat/docs/memory_architecture.md]
- [bi-chat/docs/memory_architecture.md]
- [bi-chat/docs/memory_architecture.md]
缓存穿透、击穿、雪崩的防护
- 缓存穿透
- 对不存在的键设置极短TTL的空值占位,或使用布隆过滤器前置拦截无效查询。
- 缓存击穿
- 热点Key设置互斥锁或单飞模式,仅允许一个请求重建缓存,其余等待。
- 缓存雪崩
- 为TTL增加抖动;多级缓存(本地+Redis);限流与熔断;热点Key多副本。
(本节为通用防护策略说明,不直接分析具体文件)
分布式一致性与更新策略
- 读写分离与双写
- 写入数据库后,同步删除或更新Redis中的对应键,确保下次读取命中最新数据。
- 事件驱动更新
- 通过消息队列监听数据库变更,异步更新缓存,降低写路径延迟。
- 版本号/ETag
- 为缓存值附加版本号,读取时校验版本,避免脏读。
(本节为通用一致性策略说明,不直接分析具体文件)
性能优化:连接池与内存
- 连接池
- 合理设置PoolSize、MinIdleConns、MaxIdleConns与PoolTimeout,避免连接争用与超时。
- 配置ConnMaxIdleTime与ConnMaxLifetime,平衡资源占用与连接复用。
- 超时与重试
- Dial/Read/Write超时根据网络与业务延迟调整;MaxRetries避免瞬时抖动放大。
- 内存与序列化
- 控制单值大小与键数量,避免内存碎片;序列化选择高效格式(如JSON/二进制)。
章节来源
热点识别与预热
- 热点识别
- 基于访问频率与命中率识别热点Key;对高并发接口进行专项压测。
- 预热策略
- 启动阶段批量执行高频查询,提前填充缓存;对关键报表与常用维度进行定时预热。
- StarRocks侧缓存
- 表信息缓存带过期判断与失效清理,定期同步最新表清单。
图表来源
- [bi-chat/docs/memory_architecture.md]
- [mcp-server-starrocks/src/mcp_server_starrocks/db_summary_manager.py]
章节来源
- [bi-chat/docs/memory_architecture.md]
- [mcp-server-starrocks/src/mcp_server_starrocks/db_summary_manager.py]
与数据库的双写一致性
- 写路径
- 先写数据库,再更新/删除缓存;或采用延时双删策略(写后短暂sleep再删)。
- 读路径
- 先查缓存,未命中再查数据库并回填缓存;对热点Key设置互斥重建。
- 事务与幂等
- 缓存更新需幂等,避免并发写导致的脏数据;必要时引入分布式锁。
(本节为通用一致性策略说明,不直接分析具体文件)
最佳实践与常见陷阱
- 最佳实践
- 明确TTL策略与强制刷新机制;对缓存异常进行降级;使用统一的键命名与过期策略。
- 合理配置连接池与超时;开启TLS与必要认证;监控命中率与耗时。
- 常见陷阱
- 过短TTL导致频繁重建;未处理缓存异常影响主流程;热点Key未加锁导致击穿。
- 未考虑雪崩风险,集中过期引发瞬时压力。
章节来源
依赖关系分析
- 配置来源
- Config由默认配置文件与环境变量共同决定,Option提供增量覆盖。
- 客户端创建
- Client根据Config.Mode选择不同实现,统一暴露Ping与Close等能力。
- 初始化链路
- Setup负责将配置结构体转换为Option并创建客户端,随后进行Ping校验。
- 观测集成
- 缓存命中/未命中/耗时指标通过Prometheus采集,便于统一监控。
图表来源
- [bi-common/cache/redisx/redisx-default.yaml]
- [bi-common/cache/redisx/env.go]
- [bi-common/cache/redisx/option.go]
- [bi-common/cache/redisx/config.go]
- [bi-common/cache/redisx/client.go]
- [bi-common/cache/redisx/setup.go]
- [bi-common/observability/metrics/metrics.go]
章节来源
- [bi-common/cache/redisx/redisx-default.yaml]
- [bi-common/cache/redisx/env.go]
- [bi-common/cache/redisx/option.go]
- [bi-common/cache/redisx/config.go]
- [bi-common/cache/redisx/client.go]
- [bi-common/cache/redisx/setup.go]
- [bi-common/observability/metrics/metrics.go]
性能与优化
- 连接池配置建议
- PoolSize:根据QPS与RT估算,预留一定冗余;MinIdleConns维持低延迟;MaxIdleConns避免过度占用;PoolTimeout防止排队过久。
- ConnMaxIdleTime与ConnMaxLifetime:平衡连接复用与资源回收。
- 超时与重试
- Dial/Read/Write超时与MaxRetries需结合网络质量与业务SLA调整。
- 内存与序列化
- 控制单值大小与键数量;选择合适序列化格式;对热点Key进行压缩或分片。
- 监控与告警
- 命中率、未命中率、操作耗时、错误率与连接池使用率均纳入指标体系。
章节来源
- [bi-common/cache/redisx/config.go]
- [bi-common/cache/redisx/option.go]
- [bi-common/observability/metrics/metrics.go]
故障排查指南
- 常见问题定位
- 连接失败:检查地址、认证、TLS配置与网络连通性;查看Ping错误。
- 命中率低:核对键命名、TTL与强制刷新策略;确认是否存在穿透或击穿。
- 性能抖动:检查连接池参数、超时与重试设置;观察是否有突发流量或热点。
- 指标辅助
- 使用缓存命中/未命中/耗时指标定位瓶颈;结合业务指标判断是否为上游数据库或下游计算问题。
- 降级与恢复
- 缓存异常时启用降级路径;修复后逐步恢复缓存写入。
章节来源
结论
本平台通过统一的Redisx封装与完善的配置体系,为BI分析平台提供了高可用、可观测的缓存能力。结合业务侧的缓存策略文档与观测指标,能够有效应对穿透、击穿、雪崩等挑战,并在性能与一致性之间取得平衡。建议在生产环境中持续监控命中率与耗时,配合热点识别与预热策略,进一步提升用户体验与系统稳定性。
附录
配置结构与字段映射
- 通用配置(common.pb.go)
- 字段:mode、addrs、username、password、db、protocol、max_retries、master_name、route_by_latency、route_randomly、pool、timeout。
- 业务模块配置(bi-basic/conf.pb.go、bi-notify/conf.pb.go)
- 字段同上,用于各模块独立配置Redis。
章节来源