缓存是什么?说白了就是快存慢取
你想想看,读书时做笔记,是不是为了下次复习时不用翻完整本书?缓存干的也是这事儿。把频繁访问的数据放到一个更快的地方。等下次再用,直接去快地方取就行。
我在优化线上数据库时,经常见到一个现象:同样的查询跑了几万次,每次都要走磁盘。这就像每次烧水都从挖煤开始。累不累?当然累。缓存就是来解决这个问题的。
缓存怎么工作?三步走
工作流程其实不复杂。我习惯把它拆成三个步骤理解:
- 请求查找:应用先问缓存“你有没有我要的数据?”
- 命中/未命中判断:缓存里找得到(命中),直接返回。找不到(未命中),去原始数据源拿。
- 回填与更新:从数据源拿到数据后,顺便塞进缓存,方便下次用。
举个例子。你点开一个商品详情页。第一次加载时,服务器可能要去数据库翻半天。但数据一旦被缓存,第二次访问时,缓存层秒回。我管这叫“一次慢,次次快”。
读写缓存的两种模式
这里有个容易踩坑的地方。读缓存和写缓存的策略不一样。我曾经在项目里因为搞混它们,导致数据丢了半小时才恢复。嗯,这里要注意。
| 模式 | 行为 | 典型场景 |
|---|---|---|
| Cache-Aside | 应用同时管理缓存和数据库。读时先查缓存,未命中再查库并回填。写时先更新库,再失效缓存。 | Web 应用、REST API |
| Write-Through | 写操作同时写入缓存和底层存储。缓存层充当代理,保证数据一致性。 | 文件系统缓存 |
| Write-Back | 先写缓存,延迟批量写回存储。性能高但有断电丢数据风险。 | 日志聚合、写密集场景 |
命中率:缓存的生命线
缓存好不好用,就看一个数字:命中率。
命中率 = (缓存命中的请求数 / 总请求数) × 100%。
命中率到底多重要?这么说吧。命中率 99% 的缓存系统,平均响应时间在 1ms 以内。命中率跌到 70%,响应时间可能飙到 50ms 以上。你想想看,这几乎是天壤之别。
我见过最极端的情况,有人把缓存命中率做到了 99.99%。他们做了什么?
- 冷数据不缓存,只缓存热点数据
- 设置合理的过期时间,避免缓存雪崩
- 使用 W-TinyLFU 等淘汰策略,防止缓存污染
你可能会问,命中率是不是越高越好?不一定。我建议结合业务容忍度来定。很多场景 95% 就够了。非盯着 99.99% 冲,往往要付出高昂的存储和运维成本。
性能指标:不只是快慢
衡量缓存性能,除了命中率,还有几个指标需要盯紧。
| 指标 | 定义 | 影响 |
|---|---|---|
| 延迟(Latency) | 从请求发出到收到响应的时间 | 直接影响用户体验 |
| 吞吐量(Throughput) | 单位时间能处理多少请求 | 决定系统承载力 |
| 缓存命中时间 vs 未命中时间 | 命中时 vs 未命中时各自的耗时 | 评估缓存性价比 |
| 内存/存储占用 | 缓存消耗了多少空间 | 直接影响成本 |
我个人习惯把“缓存命中时间”和“未命中时间”的比值叫做“加速比”。如果命中耗时 1ms,未命中耗时 100ms,加速比就是 100 倍。这数字能帮你向老板解释:为啥缓存这么值钱。
一图看懂:缓存核心知识体系
下面这张图概括了本章的核心逻辑。别小看它,我画了好几个版本才觉得顺眼。
缓存的微观成本
你以为缓存只有好处?错了。缓存也有成本。我总结了几点:
- CPU Cache Miss 开销:L1/L2/L3 每一级 miss,延迟都会增加几十纳秒。这对高频交易系统是致命的。
- 缓存一致性:多核环境下,一个核心改了缓存,其它核心必须知道。这需要总线嗅探或目录协议。我在项目中见过因为缓存一致性协议没用好,导致性能反而下降的案例。
- 内存占用:每多放一个 key,就多占一块内存。如果缓存了冷数据,本质是在浪费资源。我建议定期用 Redis 的
MEMORY USAGE命令看一下真实消耗。
你可能会问,那缓存到底值不值得用?我的答案是:用对地方,缓存是银弹。用错了,可能就是毒药。关键看你能不能精准识别出热数据。
嗯,缓存基础就讲这么多。记住三件事:命中率保性能、模式保一致、指标保可观测。接下来,我们会在这个基础上,逐步叠加加密策略。