Skip to content

缓存策略

**本文引用的文件** - [[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)

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 组件详解
  6. 依赖关系分析
  7. 性能与优化
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件面向BI分析平台的缓存策略,聚焦Redis在系统中的应用与架构设计,覆盖键值设计原则、穿透/击穿/雪崩防护、分布式一致性与更新策略、性能优化(连接池与内存)、热点识别与预热、与数据库的双写一致性、最佳实践与常见陷阱,以及监控指标与故障排除方法。内容基于仓库内实际代码与文档进行梳理与总结。

项目结构

Redis相关能力主要由通用模块提供,包括配置、客户端封装、环境变量加载、默认配置文件与统一初始化流程;同时在聊天与向量化检索等场景中存在缓存使用示例与策略文档;观测侧提供缓存命中/未命中/耗时等指标埋点。

图表来源

章节来源

核心组件

  • 配置与选项
    • Config:集中定义连接模式、地址、认证、协议、重试、哨兵/集群路由、连接池、超时、TLS与Dialer等。
    • Option:以函数式选项对Config进行增量修改,便于组合与复用。
    • 默认配置文件与环境变量加载:提供开箱即用的默认值,并允许通过环境变量覆盖。
  • 客户端封装
    • Client:统一封装单机/哨兵/集群三种模式的客户端创建、Ping健康检查、TLS构建、Close与底层UniversalClient暴露。
  • 初始化流程
    • Setup:将配置结构体转换为选项并创建客户端,支持兼容旧版字段,提供Ping校验与错误返回。
  • 观测与指标
    • 提供缓存命中、未命中与操作耗时等Prometheus指标,便于监控与告警。

章节来源

架构总览

Redis在BI平台中的角色:

  • 作为高性能KV存储,承载LLM响应缓存、向量检索缓存、统计数据缓存等。
  • 通过统一的Client封装与配置体系,支持单机、哨兵与集群部署形态。
  • 结合业务侧的缓存策略(TTL、强制刷新、降级)与观测指标,保障稳定性与可观测性。

图表来源

组件详解

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提供灵活的运行时配置注入与默认值保障。

图表来源

章节来源

初始化与配置转换

  • Setup将配置结构体转换为Option并创建客户端,兼容旧版字段(如单地址),并在创建后执行Ping以验证连通性。
  • convertProtoToOptions演示了如何将proto配置映射为选项,便于在不同模块间共享配置结构。

图表来源

章节来源

缓存键值设计与过期策略

  • 命名规范
    • 前缀区分用途(如 llm:模型名、vector、stat等),路径化组织,避免冲突。
    • 参数拼接采用稳定、可读的键名,必要时对输入做哈希以限制长度。
  • 过期策略
    • LLM缓存:较长TTL(如24小时),适合重复查询的稳定输出。
    • 统计数据缓存:支持强制刷新,TTL适中(如1小时),满足用户主动刷新需求。
    • 向量检索缓存:命中后直接返回,降低延迟。
  • 降级与容错
    • 缓存异常不阻断主流程,捕获异常后直接走下游计算。

图表来源

章节来源

缓存穿透、击穿、雪崩的防护

  • 缓存穿透
    • 对不存在的键设置极短TTL的空值占位,或使用布隆过滤器前置拦截无效查询。
  • 缓存击穿
    • 热点Key设置互斥锁或单飞模式,仅允许一个请求重建缓存,其余等待。
  • 缓存雪崩
    • 为TTL增加抖动;多级缓存(本地+Redis);限流与熔断;热点Key多副本。

(本节为通用防护策略说明,不直接分析具体文件)

分布式一致性与更新策略

  • 读写分离与双写
    • 写入数据库后,同步删除或更新Redis中的对应键,确保下次读取命中最新数据。
  • 事件驱动更新
    • 通过消息队列监听数据库变更,异步更新缓存,降低写路径延迟。
  • 版本号/ETag
    • 为缓存值附加版本号,读取时校验版本,避免脏读。

(本节为通用一致性策略说明,不直接分析具体文件)

性能优化:连接池与内存

  • 连接池
    • 合理设置PoolSize、MinIdleConns、MaxIdleConns与PoolTimeout,避免连接争用与超时。
    • 配置ConnMaxIdleTime与ConnMaxLifetime,平衡资源占用与连接复用。
  • 超时与重试
    • Dial/Read/Write超时根据网络与业务延迟调整;MaxRetries避免瞬时抖动放大。
  • 内存与序列化
    • 控制单值大小与键数量,避免内存碎片;序列化选择高效格式(如JSON/二进制)。

章节来源

热点识别与预热

  • 热点识别
    • 基于访问频率与命中率识别热点Key;对高并发接口进行专项压测。
  • 预热策略
    • 启动阶段批量执行高频查询,提前填充缓存;对关键报表与常用维度进行定时预热。
  • StarRocks侧缓存
    • 表信息缓存带过期判断与失效清理,定期同步最新表清单。

图表来源

章节来源

与数据库的双写一致性

  • 写路径
    • 先写数据库,再更新/删除缓存;或采用延时双删策略(写后短暂sleep再删)。
  • 读路径
    • 先查缓存,未命中再查数据库并回填缓存;对热点Key设置互斥重建。
  • 事务与幂等
    • 缓存更新需幂等,避免并发写导致的脏数据;必要时引入分布式锁。

(本节为通用一致性策略说明,不直接分析具体文件)

最佳实践与常见陷阱

  • 最佳实践
    • 明确TTL策略与强制刷新机制;对缓存异常进行降级;使用统一的键命名与过期策略。
    • 合理配置连接池与超时;开启TLS与必要认证;监控命中率与耗时。
  • 常见陷阱
    • 过短TTL导致频繁重建;未处理缓存异常影响主流程;热点Key未加锁导致击穿。
    • 未考虑雪崩风险,集中过期引发瞬时压力。

章节来源

依赖关系分析

  • 配置来源
    • Config由默认配置文件与环境变量共同决定,Option提供增量覆盖。
  • 客户端创建
    • Client根据Config.Mode选择不同实现,统一暴露Ping与Close等能力。
  • 初始化链路
    • Setup负责将配置结构体转换为Option并创建客户端,随后进行Ping校验。
  • 观测集成
    • 缓存命中/未命中/耗时指标通过Prometheus采集,便于统一监控。

图表来源

章节来源

性能与优化

  • 连接池配置建议
    • PoolSize:根据QPS与RT估算,预留一定冗余;MinIdleConns维持低延迟;MaxIdleConns避免过度占用;PoolTimeout防止排队过久。
    • ConnMaxIdleTime与ConnMaxLifetime:平衡连接复用与资源回收。
  • 超时与重试
    • Dial/Read/Write超时与MaxRetries需结合网络质量与业务SLA调整。
  • 内存与序列化
    • 控制单值大小与键数量;选择合适序列化格式;对热点Key进行压缩或分片。
  • 监控与告警
    • 命中率、未命中率、操作耗时、错误率与连接池使用率均纳入指标体系。

章节来源

故障排查指南

  • 常见问题定位
    • 连接失败:检查地址、认证、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。

章节来源