资讯动态

阿里面试:Redis缓存穿透怎么解决?别再只答缓存空值了

发布时间:2026/10/2 3:40:05 来源:尧图企业网站定制
最近在复盘大厂常见的真实线上事故和面试真题时发现一个极其经典的“翻车”场景。一、场景引入面试翻车现场前几天有个小伙伴去阿里面试。面试官抛出一个经典问题“Redis缓存穿透怎么解决”小伙伴心里一喜这题背过于是自信回答“缓存穿透就是查询不存在的key请求打到数据库这时候我们只要把空值缓存进Redis就行了。”面试官微微一笑继续追问“那如果现在有人发起恶意攻击用海量且不重复的随机ID疯狂请求你的接口你每次都把这些随机生成的空值缓存起来Redis的内存岂不是要被撑爆”小伙伴瞬间愣住支支吾吾答不上来。很遗憾这场面试基本就走远了。二、问题拆解缓存穿透到底在问什么在给出完美回答之前我们要彻底搞懂什么是缓存穿透。业务正常的逻辑是先查Redis有数据直接返回没数据就查MySQL查到了写回Redis并返回。 但缓存穿透指的是查询一个在缓存和数据库中都绝对不存在的数据。这就导致每次请求都会像隐形一样穿过Redis直接重重地砸在数据库上。在遭到恶意攻击时MySQL很容易因为连接数被打满或CPU飙升而宕机。面试官真正想考察的不仅仅是你懂不懂概念而是你有没有面对极端高并发和恶意攻击时的系统化防御思维。三、核心方案三层防护体系作为架构师我们在生产环境中绝不会只用一招而是会构建一套纵深防御体系。第一层防线接口参数校验大门安保这是最基础但也最容易被忽视的一层。在网关或应用入口处直接拦截掉明显不合法的请求。比如查询的商品ID必须是大于0的正整数、手机号格式必须严格符合正则。这一层成本极低能把大部分低级的脚本攻击直接挡在系统门外。第二层防线布隆过滤器核心安检通道这是解决大流量缓存穿透的真正核心方案。布隆过滤器Bloom Filter是一种空间效率极高的概率型数据结构。它的核心逻辑是利用多个哈希函数和一个位图BitMap来快速判断一个元素是否存在。查询布隆过滤器时如果它判断不存在那数据一定不存在请求直接丢弃向前端返回空。如果它判断存在那数据可能存在存在一定的误判率这时候才允许请求继续往下走去查缓存或数据库。优点是占用内存极小查询速度极快缺点是存在一定的误判率且原生不支持删除操作。第三层防线缓存空值 短过期最后的兜底经过前面两层过滤如果依然有极少量的穿透请求比如布隆过滤器的误判打到了数据库并且数据库确实没查到数据我们才会采用“缓存空值”的策略。极其关键的一点缓存空值必须设置一个非常短的过期时间比如3到5分钟。这样既能防止短期内同一个不存在的key频繁打库又能避免恶意的大量随机key永久占用Redis宝贵的内存资源。四、面试标准答案总结当面试官再问起这个问题你可以这样有条理地回答解决缓存穿透需要构建分层的防御体系主要分为三步参数校验拦截在应用层入口对请求参数做严格的合法性校验从源头过滤无效请求。布隆过滤器前置拦截将所有存在的数据哈希到一个布隆过滤器中。请求过来先查布隆过滤器判断数据大概率存在才放行不存在则拦截。缓存空值做兜底如果请求还是打到了数据库且为空就将空对象写入Redis并强制设置一个较短的过期时间以此作为最后一道防线。五、生产环境避坑指南除了八股文面试官往往更喜欢听听你在实战中的经验。你可以补充这几点应对布隆过滤器的误判可以通过调大布隆过滤器的容量或增加Hash函数数量来降低误判率配合最后一步的缓存空值来处理那极少部分漏网之鱼。分布式架构下的一致性在分布式微服务架构中本地的布隆过滤器很难同步生产环境中通常会使用基于Redis 的 Bitmap来集中式存储和实现分布式的布隆过滤器。监控与报警对于空值缓存被频繁命中的情况必须配置监控大屏和限流策略一旦触发阈值立刻报警人工介入。写在最后这道题表面上是在问Redis实际上是在考察你的系统化设计能力和严谨的工程思维。从单一防御到分层防御这就是普通开发和资深架构师的区别。关于Redis的高级面试题除了穿透还有缓存击穿、缓存雪崩、热点Key等经典连环问。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑