1) 【一句话结论】在高并发场景下,系统因缓存穿透导致数据库压力激增崩溃,通过引入布隆过滤器+缓存+数据库三级架构,结合限流和熔断机制,成功解决高并发下的系统稳定性问题。
2) 【原理/概念讲解】老师会解释高并发下的系统崩溃常见原因,比如缓存穿透(当查询不存在的数据时,缓存中没有,直接访问数据库,大量无效请求导致数据库压力过大甚至崩溃)。布隆过滤器是一种空间效率高的概率型数据结构,用于判断元素是否属于某个集合,适用于高并发下的快速过滤(类似“黑名单”检查,减少无效数据库查询)。其核心是多个哈希函数将元素映射到位数组,判断时若所有位为1则可能存在,否则不存在(存在误判率但空间效率高)。
3) 【对比与适用场景】
| 方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|
| 布隆过滤器 | 基于哈希的概率型数据结构,用于判断元素是否属于集合 | 空间效率高,查询快,存在误判率(假阳性) | 作为缓存前端的过滤层,快速拦截无效请求 | 需接受一定误判率,适用于不存在的数据过滤 |
| 普通缓存(如Redis) | 存储热点数据,提高访问速度 | 数据持久化,支持多种数据结构 | 存在缓存穿透风险,需结合布隆过滤器 | 需设置合理缓存策略,避免冷启动 |
| 数据库 | 后端数据存储 | 事务支持,数据一致性 | 作为最终数据源,处理有效请求 | 需限流和熔断保护,避免被高并发击穿 |
4) 【示例】
假设用户查询商品ID为999999(不存在)的详情。请求流程:
- 用户请求商品详情接口;
- 服务端先查询Redis缓存(key为“product:999999”),缓存未命中;
- 接着查询布隆过滤器(判断该ID是否存在),布隆过滤器返回“不存在”;
- 直接返回“商品不存在”错误,避免访问数据库;
- 若是存在的ID(如1),则先查布隆过滤器(存在),再查Redis,若Redis未命中则查数据库,缓存结果后返回。
这样减少无效数据库查询,降低数据库压力。
5) 【面试口播版答案】
在之前的项目中,我们遇到了高并发下的系统崩溃问题。具体场景是,在双十一大促期间,大量用户查询不存在的商品ID(比如一个不存在的商品编号),导致系统直接访问数据库,数据库压力瞬间激增,最终系统崩溃。分析过程:通过查看系统日志和压力测试数据,发现大量“缓存未命中+数据库查询失败”的日志,定位到缓存穿透问题。解决方案:引入布隆过滤器作为缓存前端的过滤层,当用户查询商品时,先通过布隆过滤器判断该ID是否存在,若不存在则直接返回错误,避免访问数据库;若存在则继续查询Redis缓存,若缓存未命中则查询数据库,并将结果缓存。同时,我们增加了限流和熔断机制,对商品查询接口进行流量控制,防止极端情况下的雪崩效应。通过这些措施,系统在高并发下的稳定性得到显著提升,没有再出现崩溃情况。
6) 【追问清单】
- 问题:你提到的布隆过滤器是如何实现的?用了哪些哈希函数?误判率大概是多少?
回答要点:通常使用多个不同的哈希函数(如MurmurHash、FNVHash等),误判率根据位数组和元素数量调整,比如当位数组长度为N,元素数量为M时,误判率约为(1 - e^(-M/k))^k,其中k是哈希函数数量。
- 问题:在引入布隆过滤器后,对系统的性能影响有多大?有没有做性能测试?
回答要点:引入后,无效请求的数据库查询被拦截,数据库压力降低约80%,响应时间从原来的2秒左右缩短到0.1秒左右,性能提升明显,通过压力测试验证了稳定性。
- 问题:除了布隆过滤器,有没有考虑过其他解决方案?比如使用布隆过滤器+缓存+数据库的分层架构,或者使用分布式锁?
回答要点:考虑过使用分布式锁,但分布式锁在高并发下会导致大量请求阻塞,性能下降,而布隆过滤器结合限流和熔断更高效,适合高并发场景。
- 问题:在限流和熔断机制中,阈值是如何设定的?有没有根据业务数据动态调整?
回答要点:限流阈值根据历史流量数据设定,比如每秒处理1000个请求,熔断阈值根据错误率设定,当错误率超过50%时触发熔断,保护系统。
- 问题:如果后续遇到更严重的高并发情况,比如数据库本身也出现瓶颈,你会如何进一步优化?
回答要点:会考虑数据库读写分离、分库分表、使用缓存集群等,从数据库层面提升并发能力,同时结合消息队列异步处理部分请求,减轻数据库压力。
7) 【常见坑/雷区】
- 只描述问题不提解决方案:面试官会认为你无法解决问题,缺乏技术能力。
- 技术细节模糊:比如布隆过滤器的误判率、限流阈值的设定等,显得不专业。
- 忽略系统设计的整体性:只关注单个技术点,没有考虑限流、熔断等配套机制,显得方案不完整。
- 没有量化效果:比如只说“系统稳定了”,没有提到性能提升的具体数据,缺乏说服力。
- 混淆缓存穿透和缓存击穿:缓存击穿是热点数据失效导致大量请求集中访问数据库,而缓存穿透是不存在的数据查询,容易混淆概念,导致分析不准确。