️ 前言从“缓存真香”到“线上事故”很多同学做项目时觉得引入 Redis 做缓存就是“性能救星”查询先走 Redis没有再查数据库速度飞起直到上线后遇到诡异问题突然大量请求把数据库打挂CPU 爆了某热门商品页突然全白日志里全是 “DB 连接超时”半夜被报警叫醒“缓存穿透请求直接冲垮 DB”这就是缓存三大坑穿透、雪崩、击穿。今天用校招面试官最爱考的角度拆解 Redis 如何优雅解决它们还附Lua 脚本实战 问题现象缓存的“灵异事件”1. 缓存穿透“查不存在的数据DB 被打穿”场景用户恶意请求一个不存在的商品 ID如product:999999Redis 中没有每次都穿透到 DB 查询。结果大量请求直接打 DBDB 压力暴增甚至宕机。2. 缓存雪崩“大量缓存同时失效DB 被瞬间压垮”场景电商大促前运营批量设置了 10 万商品的缓存有效期为 1 小时整点如 20:00所有缓存同时过期。结果20:00 整所有请求瞬间穿透到 DBDB 并发量骤增直接被压垮。3. 缓存击穿“热点 Key 过期瞬间DB 被瞬间冲击”场景某明星带货某商品product:10086的缓存恰好在流量峰值期过期此时百万请求同时涌入。结果缓存失效百万请求直接冲 DBDB 瞬间被打满服务雪崩。 你必须懂的缓存的底层逻辑缓存的核心是“空间换时间”但分布式场景下缓存和 DB 的配合需要更精细的设计。1. 缓存的工作流程经典流程读操作先查 Redis → 存在则返回不存在则查 DB → DB 返回后写入 Redis​ 再返回。写操作先改 DB → 再删 Redis或更新 Redis。2. 缓存的“有效期TTL”机制Redis 的 Key 可以设置过期时间如EX 3600到期后自动删除。但如果大量 Key 同时过期就会引发雪崩如果热点 Key 过期就会引发击穿。️ 缓存三大问题的解决方案1. 缓存穿透“查不存在的数据DB 被打穿”问题本质请求的数据缓存和 DB 都不存在缓存永远“挡不住”请求直接打 DB。解决方案 1缓存空对象简单但耗内存逻辑当 DB 查询不到数据时也往 Redis 中写一个“空值”如或null并设置较短的 TTL如 5 分钟。优点实现简单维护方便。缺点消耗内存存在短期不一致比如 DB 后来新增了数据Redis 里的空值还没过期会返回空。解决方案 2布隆过滤器高效拦截不存在的请求逻辑布隆过滤器是一种概率型数据结构特点是不存在的元素一定不存在存在的元素可能存在。实现把所有可能存在的 Key​ 提前放入布隆过滤器。请求时先过布隆过滤器如果过滤器说“不存在”直接返回DB 一定没有如果过滤器说“存在”再查 Redis/DB。2. 缓存雪崩“大量缓存同时失效DB 被瞬间压垮”问题本质大量缓存 Key同时过期或 Redis 宕机请求全部穿透到 DBDB 压力暴增。解决方案 1给不同 Key 加随机 TTL避免同时过期逻辑设置缓存 TTL 时在原基础上加一个随机值如TTL 3600 rand(0, 600)让 Key 的过期时间分散。优点实现简单有效避免“集体过期”。解决方案 2提高 Redis 高可用性哨兵/集群逻辑用Redis 哨兵Sentinel​ 或Redis Cluster​ 保证 Redis 服务不宕机。即使主节点挂了从节点/集群节点能快速接管避免缓存整体失效。解决方案 3缓存降级 限流逻辑当 Redis 故障或 DB 压力过大时降级为非缓存逻辑如返回默认值、静态页面同时通过限流如 Sentinel、Guava RateLimiter限制请求量保护 DB。解决方案 4多级缓存大型互联网应用逻辑客户端浏览器 网关Nginx 应用层本地缓存 Redis多层缓存分散压力。即使 Redis 失效本地缓存也能挡一部分请求。3. 缓存击穿“热点 Key 过期瞬间DB 被瞬间冲击”问题本质一个高并发的热点 Key​ 突然过期大量请求同时穿透到 DBDB 被打满。解决方案 1互斥锁分布式锁逻辑当缓存失效时只允许一个线程去重建缓存查 DB 写 Redis其他线程等待或返回旧值。实现用 Redis 的SETNXSet if Not Exists命令实现分布式锁。解决方案 2逻辑过期不设置 TTL永久有效逻辑缓存 Key不设置过期时间但存储一个“逻辑过期时间”如expire_time字段。业务层查询时判断逻辑时间是否过期没过期直接返回缓存值过期了启动异步线程去重建缓存当前线程返回旧值或默认值。 一句话总结面试必背缓存穿透查不存在的数据 → 用缓存空对象或布隆过滤器拦截避免请求打 DB。缓存雪崩大量缓存同时失效 → 用随机 TTL、高可用架构、降级限流、多级缓存分散压力。缓存击穿热点 Key 过期 → 用分布式锁互斥或逻辑过期异步重建保护 DB 不被瞬间冲击。Redis 解决这三大问题的核心是“原子化操作Lua 脚本 分层防护空对象、布隆、锁、随机 TTL”结合工具类封装可大幅提升系统稳定性 面试加分项能说出布隆过滤器的“误判率”哈希函数数越多、位数组越大误判率越低但内存消耗越高。能对比“互斥锁”和“逻辑过期”的适用场景互斥锁适合缓存重建快的场景逻辑过期适合缓存重建慢、允许短暂不一致的场景。能画出多级缓存架构图客户端 → Nginx → 本地缓存 → Redis → DB并解释每一层的作用。