缓存系统
缓存系统通过在访问速度快的存储中保存常用数据,大幅提升系统性能和用户体验。是构建高并发、低延迟系统的关键技术。
缓存原理
缓存作用
- 性能提升: 减少数据库查询、降低延迟、提高吞吐
- 成本降低: 减少数据库压力、降低 I/O 消耗
- 可用性: 容错能力、数据预热、快速响应
缓存流程
- 检查缓存中是否存在数据
- 如果存在,直接返回(缓存命中)
- 如果不存在,查询数据源(缓存缺失)
- 写入缓存并返回
评价指标
- 命中率: 缓存命中次数 / 总查询次数
- 延迟: 平均响应时间、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 持久化、冷启动数据
- 故障处理: 缓存故障转移、自动降级
- 版本升级: 滚动升级、零停机、兼容性验证