Skip to content

缓存系统 ​

缓存系统通过在访问速度快的存储中保存常用数据,大幅提升系统性能和用户体验。是构建高并发、低延迟系统的关键技术。

缓存原理 ​

缓存作用 ​

  • 性能提升: 减少数据库查询、降低延迟、提高吞吐
  • 成本降低: 减少数据库压力、降低 I/O 消耗
  • 可用性: 容错能力、数据预热、快速响应

缓存流程 ​

  1. 检查缓存中是否存在数据
  2. 如果存在,直接返回(缓存命中)
  3. 如果不存在,查询数据源(缓存缺失)
  4. 写入缓存并返回

评价指标 ​

  • 命中率: 缓存命中次数 / 总查询次数
  • 延迟: 平均响应时间、P99 响应时间
  • 容量: 可存储数据量、成本
  • 淘汰率: 缓存溢出频率、热数据保留

缓存分层 ​

L1:本地缓存 ​

  • 内存缓存: 应用进程内、访问最快、容量有限
  • 工具: GuavaCache、Caffeine、节点本地
  • 特点: 进程隔离、无网络开销、热数据优先

L2:分布式缓存 ​

  • Redis: 内存存储、持久化、丰富数据结构、高性能
  • Memcached: 简单键值、内存存储、高并发
  • 特点: 跨进程、网络通信、全局缓存

L3:磁盘缓存 ​

  • 数据库缓存: MySQL Query Cache、InnoDB Buffer Pool
  • HTTP 缓存: CDN、反向代理缓存
  • 特点: 容量大、访问慢、持久化

Redis 缓存 ​

数据结构 ​

  • String: 计数、缓存对象、位操作
  • Hash: 缓存对象、字段级别访问、内存高效
  • List: 队列、最新数据、消息队列
  • Set: 标签、用户交集、去重计数
  • Sorted Set: 排行榜、时间序列、范围查询

过期策略 ​

  • TTL: 设置过期时间、自动删除、内存管理
  • 惰性删除: 访问时检查、减少内存开销
  • 主动删除: 定期清理、及时回收、内存稳定

淘汰策略 ​

  • LRU: Least Recently Used、访问时间优先
  • LFU: Least Frequently Used、访问频率优先
  • 随机删除: Random Eviction、简单高效
  • 不淘汰: NoEviction、报错处理、强制性

缓存策略 ​

Cache-Aside ​

  • 读流程: 查询缓存 → 不存在查源 → 写入缓存
  • 写流程: 更新源 → 删除缓存(或更新)
  • 特点: 简单常用、缓存和源分离、更新灵活
  • 缺点: 初始化慢、缓存缺失多

Write-Through ​

  • 写流程: 同时更新缓存和源、保证一致性
  • 读流程: 从缓存读取、不存在再查源
  • 特点: 一致性强、写操作成本高
  • 缺点: 写入延迟、假设目标可用性

Write-Behind ​

  • 写流程: 先写缓存、异步写源
  • 优点: 写入快、性能优秀
  • 缺点: 缓存故障可能丢数据、一致性弱

缓存一致性 ​

缓存失效 ​

  • 主动失效: 更新时立即失效、简单但覆盖面宽
  • 延迟失效: 设置合理 TTL、定期刷新
  • 版本控制: 版本号变化、缓存 key 变化、平滑过渡

缓存预热 ​

  • 启动预热: 应用启动时加载常用数据
  • 定期预热: 正常运行时更新热数据
  • 工具: 计划任务、异步加载、主动刷新

缓存穿透、击穿、雪崩 ​

缓存穿透:访问不存在的数据,每次都查询源

  • 解决:布隆过滤、空值缓存、参数校验

缓存击穿:热键失效,大量请求查询源

  • 解决:分布式锁、互斥锁、热键监控

缓存雪崩:大量缓存同时失效,源压力过大

  • 解决:过期时间分散、缓存预热、流量限制

缓存框架 ​

Caffeine ​

  • 特性: 高性能本地缓存、自动驱逐、TTL/Size 控制
  • API: 简洁易用、Lambda 支持
  • 性能: 并发处理、原子操作、吞吐量高

分布式缓存框架 ​

  • Spring Cache: 注解驱动、透明集成
  • Hazelcast: 内存数据网格、分布式结构
  • Ignite: 分布式计算、缓存一体化

缓存问题排查 ​

高缓存命中同时性能仍差 ​

  • 原因:网络延迟、反序列化、GC 停顿
  • 解决:优化网络、压缩数据、GC 优化

缓存数据不一致 ​

  • 原因:更新逻辑错误、并发竞态、网络延迟
  • 解决:加锁、版本控制、延迟更新

内存持续增长 ​

  • 原因:缓存淘汰失效、内存泄漏、没有过期
  • 解决:检查配置、监控内存、定期清理

性能优化 ​

缓存读写 ​

  • 批量读取: 减少网络往返、提高吞吐
  • 管道化: Pipeline 批量命令、减少延迟
  • 异步访问: 异步加载、不阻塞主线程

数据序列化 ​

  • 序列化格式: JSON vs 二进制、体积 vs 速度
  • 压缩: GZIP、Snappy、减少网络传输
  • 字段优化: 只缓存必要字段、定期更新

缓存预热 ​

  • 启动预热: 快速暖缓存、减少初始延迟
  • 智能预热: 预测热咨询、机器学习应用
  • CDN 预热: 边缘节点分发、地理分布

最佳实践 ​

缓存设计 ​

  • 合理 TTL: 业务可接受的不一致程度
  • 缓存 key 设计: 可读性、版本隔离、容易管理
  • 缓存预案: 降级策略、故障应对、监控告警

监控指标 ​

  • 命中率: > 80% 为合理、持续上升为目标
  • 延迟: P99 < 50ms (本地) / P99 < 200ms (远程)
  • 容量: 监控使用率、定期扩容、成本规划

运维管理 ​

  • 备份恢复: RDB/AOF 持久化、冷启动数据
  • 故障处理: 缓存故障转移、自动降级
  • 版本升级: 滚动升级、零停机、兼容性验证