缓存工程全景知识图谱
偏工程落地的缓存体系总装图,回答缓存如何从"加个 Redis"进化到多级一致性架构(2025-2026 观察窗口)
阅读边界:本页定位为缓存工程总览页,聚焦缓存选型、多级架构、生态差异、热点治理、分布式锁/限流与运维观测。
它会提到一致性问题,但不会深挖失效顺序、旧值回填、业务正确性检查表这类细节;如果你更关心“缓存为什么会把系统带偏,以及怎样把一致性风险收住”,继续看
缓存一致性图谱。
本地缓存
Caffeine / Guava / Ehcache
→
分布式缓存
Redis / Memcached / KeyDB
→
代理与路由
Cluster / Twemproxy / Codis
→
持久化与回源
DB / 对象存储 / CDN
→
治理与观测
命中率 / 热点 / 大Key / 过期
| 层级 | 核心依赖 | 失败后果 |
| 本地缓存 | JVM/进程生命周期、GC 压力 | 重启即失效,冷启动风暴 |
| 分布式缓存 | 网络延迟、序列化协议、连接池 | P99 抖动、序列化兼容性问题 |
| 多级缓存 | 一致性协议、失效广播机制 | 脏读、数据不一致窗口 |
| 缓存回源 | 数据库负载、连接池、降级策略 | 缓存击穿导致 DB 雪崩 |
| 治理观测 | 全链路 metrics、慢查询日志 | 热点不可见、大 Key 无法定位 |
2003Memcached 发布,开启分布式内存缓存时代
2009Redis 发布,单线程 + 丰富数据结构重新定义缓存
2012Redis Sentinel 提供高可用方案
2015Redis Cluster GA,原生分片能力落地
2016Caffeine 发布,W-TinyLFU 算法超越 Guava Cache
2018Redis 5.0 Streams 模块,缓存向多模型演进
2020Redis 6.0 ACL + 多线程 IO,企业级安全与性能提升
2022Dragonfly、KeyDB 等多线程替代方案成熟
2024Redis 许可变更(SSPL),Valkey 分叉,生态分裂
4.1 缓存模式
Cache-Aside(旁路缓存):应用自行管理缓存读写,最常见也最灵活。读时先查缓存,未命中则查 DB 并回填。写时先更新 DB,再删除缓存。简单但一致性窗口依赖删除时机。
Read-Through / Write-Through:缓存层代理所有读写,应用只和缓存交互。一致性更强但缓存层变重,适合读多写少且能接受缓存层故障影响写入的场景。
Write-Behind(异步写回):写入先落缓存,异步批量刷回 DB。吞吐最高但有数据丢失风险,适合允许短暂不一致的计数、日志类场景。
4.2 一致性策略
延迟双删:先删缓存 → 更新 DB → 延迟再删一次。覆盖并发读导致的脏数据回填,但延迟时间难以精确估算。
Canal/Binlog 订阅:通过监听 DB 变更日志异步更新缓存,解耦业务代码。延迟取决于 Binlog 消费速度,适合最终一致性场景。
版本号/CAS:缓存写入时携带版本号,只有版本匹配才更新。防止旧数据覆盖新数据,但增加了读写复杂度。
阅读提醒:这里更像总览速写。删除顺序、旧值回填、业务正确性和止血策略的展开分析,建议继续看 缓存一致性图谱。
4.3 穿透、击穿与雪崩
缓存穿透:查询不存在的数据,每次都打到 DB。防御:布隆过滤器拦截、空值缓存(短 TTL)、请求参数校验前置。
缓存击穿:热点 Key 过期瞬间大量请求涌入 DB。防御:互斥锁(singleflight)、逻辑过期(后台异步刷新)、永不过期 + 主动更新。
缓存雪崩:大量 Key 同时过期或缓存集群宕机。防御:过期时间加随机抖动、多级缓存兜底、熔断降级、集群高可用。
4.4 热点 Key 与大 Key 治理
热点 Key:单个 Key 的 QPS 远超均值,导致单分片过载。应对:本地缓存兜底(L1 挡热点)、Key 拆分(加后缀分散到多分片)、读写分离(从节点分担读)。
大 Key:单个 Value 超过 10KB(String)或元素数超过 5000(集合类型)。危害:网络带宽占满、慢查询阻塞、集群迁移超时。应对:拆分为多个小 Key、异步删除(UNLINK)、定期扫描告警。
过期策略:惰性删除 + 定期采样删除是 Redis 默认策略。内存淘汰策略选择:allkeys-lru 适合缓存场景,volatile-ttl 适合混合持久化场景。避免 noeviction 导致写入阻塞。
4.5 分布式锁与限流
Redis 分布式锁:SET NX EX 是基础实现,但存在主从切换丢锁风险。Redlock 算法尝试解决但争议大(Martin Kleppmann vs Antirez 之争)。工程建议:非金融场景用单节点锁 + 合理超时即可,强一致场景用 ZooKeeper 或 etcd。
Lua 原子操作:将判断 + 操作封装为 Lua 脚本,保证原子性。适合库存扣减、计数器、限流等需要 CAS 语义的场景。
限流实现:令牌桶(平滑突发)、滑动窗口(精确计数)、漏桶(恒定速率)。Redis + Lua 实现分布式限流,本地限流用 Guava RateLimiter 或 Resilience4j。
分布式缓存选型
- Redis:生态最完善,数据结构丰富,单线程模型简单可预测。适合绝大多数场景,但单线程是吞吐天花板
- Memcached:纯 KV、多线程、内存效率高。适合简单字符串缓存、Session 存储,不支持持久化和复杂数据结构
- KeyDB:Redis 多线程分叉,API 兼容。适合需要更高吞吐但不想改代码的场景
- Dragonfly:多线程重写,号称单实例替代集群。性能激进但生态和稳定性仍在验证期
- Valkey:Redis 开源分叉(Linux Foundation),社区驱动。许可证安全,长期替代 Redis 的候选
本地缓存选型
- Caffeine:Java 生态最优选,W-TinyLFU 淘汰算法命中率最高,异步加载、统计完善
- Guava Cache:Caffeine 的前身,API 稳定但性能和命中率不如 Caffeine,新项目不建议选
- Ehcache:支持堆外内存和磁盘持久化,适合需要大容量本地缓存的场景,配置较重
- Go: groupcache/ristretto:Go 生态的本地缓存方案,groupcache 支持分布式填充,ristretto 高性能并发
Cache-Aside 模式→
一致性策略选择→
穿透/击穿/雪崩防御→
多级缓存架构
容量规划与成本模型→
热点治理与大 Key 防控→
分布式锁与并发控制→
集群拓扑与扩缩容
监控指标体系→
大 Key / 慢查询排查→
故障演练与主从切换→
在线扩缩容与数据迁移
误区:加缓存就能解决性能问题
缓存只能加速读路径。如果瓶颈在写入、在计算、在网络,加缓存不仅无效还增加了一致性负担。先定位瓶颈,再决定是否需要缓存。
误区:Redis 是万能数据结构服务器
Redis 的数据结构能力容易让人把它当数据库用。但它的持久化是尽力而为,主从切换可能丢数据,内存成本远高于磁盘。缓存就是缓存,不是主存储。
误区:缓存一致性靠设置短过期就行
短过期只是缩小了不一致窗口,不是消除。高频写入场景下,短过期反而导致命中率暴跌。一致性需要主动失效机制和明确主数据归属;一致性细节建议单独看缓存一致性专题页。
误区:分布式锁用 Redis 就够安全
Redis 单节点锁在主从切换时可能丢失。Redlock 在网络分区和时钟漂移下仍有争议。如果锁的正确性关乎资金安全,用 ZooKeeper 或 etcd 的强一致方案。
确定趋势:Redis 生态分裂后 Valkey 成为开源主力、本地缓存(Caffeine)重新受重视、多级缓存架构成为中大型系统标配。
演进中:Serverless Redis(Upstash/Momento)降低运维门槛、多租户隔离与资源配额精细化、缓存即服务与 Edge 缓存融合。
值得关注:许可证风险推动企业迁移 Valkey/Dragonfly、AI 推理结果缓存(Semantic Cache)、向量相似度缓存与传统 KV 缓存融合。
总结
缓存工程的本质不是"把热数据放内存",而是在延迟、一致性、成本和运维复杂度之间找到可持续的平衡点。好的缓存架构让系统快而可控,坏的缓存架构让系统快但脆弱。