后端开发:缓存(Cache)简介

缓存(Cache) 本质上是:把访问频率高、计算或查询代价大的数据,临时存放在离请求更近、访问更快的地方,用"空间换时间",减少对慢速数据源(如数据库、磁盘、远程服务)的重复访问。

可以把它理解成"数据的临时高速副本"。比如查商品详情:

请求 → 先查缓存 → 命中就直接返回;未命中再查数据库 → 把结果写回缓存 → 下次请求命中缓存

1. 缓存解决什么问题

主要解决三类问题:

  1. 提升访问速度:内存/本地缓存比查数据库、磁盘、远程接口快得多。

  2. 降低后端压力:大量重复请求被缓存挡住,不都打到 DB。

  3. 提升系统吞吐和可用性:DB 慢或短暂抖动时,缓存可以兜一部分读流量。

代价是:数据可能不是最新、需要额外内存、要处理失效和一致性。

2. 缓存的核心指标

  • 命中率 Hit Rate:请求在缓存中找到数据的比例。命中率越高,缓存价值越大。

  • 未命中 Miss:缓存没有,需要回源查 DB 或重新计算。

  • TTL 存活时间:key 多久后过期,比如 30 分钟。

  • 淘汰策略:内存满了删谁,如 LRU(最近最少使用)、LFU(最不经常使用)、FIFO、随机淘汰等。

  • 容量和成本:缓存不是无限大,要控制内存。

  • 一致性:缓存里的值和 DB 是否一致,能容忍多旧。

3. 缓存在系统里的位置

常见分层:

  1. 客户端/浏览器缓存:HTTP 缓存、LocalStorage。

  2. CDN 缓存:静态资源、图片、视频分发。

  3. 应用本地缓存:进程内缓存,如 Caffeine、Guava Cache,速度快但多实例之间不一致。

  4. 分布式缓存:如 Redis、Memcached,多个应用实例共享。

  5. 数据库缓存/缓冲池:MySQL InnoDB Buffer Pool 等。

  6. CPU 缓存:L1/L2/L3,最底层但最快。

后端日常说"加缓存",通常指 Redis 这类分布式缓存 + 本地缓存。

4. 缓存 key 和 value

缓存里每条数据通常以键值对存:

  • key :唯一标识,如 user:1001、product:2002。

  • value:序列化后的数据,如 JSON、二进制、对象。

  • TTL:这个 key 多久过期。

"热点 key"就是被高频访问的 key,比如爆款商品、首页配置、秒杀库存。

5. 常见的缓存读写模式

最常用的是 Cache Aside(旁路缓存):

读:

  1. 先读缓存;

  2. 命中直接返回;

  3. 未命中查 DB;

  4. 把结果写回缓存,设置 TTL。

写:

  1. 先更新 DB;

  2. 再删除缓存,而不是直接更新缓存。

    因为直接更新缓存容易并发覆盖,删除后下次读再重建更常见。

其他模式:

  • Read Through:缓存层代理读,未命中由缓存组件回源。

  • Write Through:写缓存时同步写后端。

  • Write Behind:先写缓存,异步批量写 DB,性能高但可能丢数据。

6. 缓存为什么会失效

缓存不是永久存储,常见失效原因:

  1. TTL 到期:设置了过期时间,时间到就失效。

  2. 主动删除:数据更新后删缓存。

  3. 内存淘汰:内存满了,按 LRU/LFU 等策略淘汰。

  4. 缓存服务故障:Redis 宕机、网络分区。

  5. 手动清理/发布重启:本地缓存随进程重启丢失。

7. 缓存带来的典型问题

缓存穿透、缓存击穿、缓存雪崩是缓存系统常见的三类故障场景:

问题 核心原因 典型表现 常见保护措施
缓存穿透 查询的数据缓存和数据库都不存在,请求每次都绕过缓存打到数据库 恶意用不存在的 ID 高频查询,DB 压力大 缓存空值/短 TTL;布隆过滤器提前拦截;参数合法性校验;限流;对异常查询做风控
缓存击穿 某个热点 key 过期瞬间,大量并发请求同时打到数据库 热点商品/配置过期时 DB 瞬间压力飙升 互斥锁/单飞保证只有一个请求回源;逻辑过期;热点 key 预热或永不过期;限流降级
缓存雪崩 大量 key 同时过期,或缓存服务宕机,导致请求大面积打到数据库 大批缓存失效后 DB 被压垮,甚至级联故障 TTL 加随机值、分批过期;缓存集群高可用;多级缓存;预热;熔断、限流、降级;持久化和故障转移

后端开发:缓存穿透/击穿/雪崩保护措施概述-CSDN博客本文系统阐述了缓存穿透、击穿与雪崩的防护策略。针对缓存穿透,提出缓存空值、布隆过滤器、参数校验、限流及风控等多层防御;缓存击穿则通过互斥锁、逻辑过期、预热及限流降级保障热点数据可用性;缓存雪崩应对措施包括TTL随机化、集群高可用、多级缓存架构、预热及熔断降级。整体强调组合使用多种手段,结合限流、监控与容灾机制,构建稳定高效的缓存体系。https://blog.csdn.net/qq_54708219/article/details/169164209?sharetype=blogdetail&sharerId=169164209&sharerefer=PC&sharesource=qq_54708219&spm=1011.2480.3001.8118简单记:

  • 穿透 :查不存在的数据,缓存挡不住。

  • 击穿 :一个热点 key 过期,瞬间打穿缓存。

  • 雪崩 :大量 key 同时失效或缓存整体不可用,数据库被大面积压垮。

此外还有:

  • 缓存一致性:DB 更新后缓存旧数据,需要删除/延迟双删/订阅 binlog 等策略。

  • 热 key:单个 key 流量过大,可能打爆单个缓存节点,需要分片、本地缓存、限流。

  • 大 key:value 太大,影响网络和内存,需要拆分。

8. 一个完整例子

商品详情缓存:

bash 复制代码
key: product:1001
value: {"id":1001,"name":"手机","price":3999}
TTL: 30分钟

请求流程:

  1. 用户查商品 1001;

  2. 先查 Redis product:1001;

  3. 命中,直接返回,DB 无压力;

  4. 未命中,查 MySQL;

  5. 查到后写回 Redis,设置 30 分钟 TTL;

  6. 下次请求继续命中缓存。

如果 product:1001 是爆款,30 分钟后过期瞬间大量请求同时未命中,就可能发生缓存击穿。

总结

缓存 = 高速临时数据副本 + 命中优先 + 未命中回源 + 过期/淘汰机制。

它的核心价值是加速访问、降低 DB 压力、提升吞吐 ;核心代价是一致性、内存成本、失效和故障处理。后端设计缓存时,不只是"加个 Redis",还要考虑:命中率、TTL、淘汰策略、更新一致性,以及穿透、击穿、雪崩保护。

相关推荐
小静AI工程实验室1 小时前
AI 应用缓存键怎么设计?租户、模型、提示词与索引版本的 7 项离线验证
缓存
IT_陈寒1 小时前
Vue项目实战经验分享:动态组件在Keep-Alive下的缓存陷阱
前端·人工智能·后端
程序猿乐锅1 小时前
【从0-1学习Python | 第九篇】继承
开发语言·后端·python·学习·fastapi
2601_954005621 小时前
11 种触发 × 18 种行为:ricon 交互编排系统全解
前端·后端·物联网·数学建模·信息可视化·交互
李纲明1 小时前
WordPress 结账页一直转圈不跳支付:AJAX、缓存排除、支付回调和 REST 怎么逐层核
运维·ajax·缓存·wordpress·woocommerce·devdiy·结账
会编程的吕洞宾1 小时前
Spring AI 语义缓存:重复提问不重复花钱
java·人工智能·后端·spring
郭小李2 小时前
spring @RequestMapping注解
java·后端·spring
喵了几个咪11 小时前
GoWind CMS 拆解:在 Go 里给 TipTap 搭一套 Yjs 协同后端
开发语言·后端·golang
Flynt11 小时前
我把微信运动的排行榜和定点推送复刻了一遍:100万次步数更新只要4秒,坑在别处
redis·后端·性能优化