
1) 【一句话结论】
在秒杀高并发场景中,通过监控定位到数据库慢查询是核心瓶颈,通过分布式缓存(解决缓存穿透)、数据库索引与分库分表(提升读写性能)、消息队列异步处理(解耦请求与库存扣减)、限流策略(控制流量)的组合优化,将P99响应时间从2秒降至50ms,系统错误率从5%降至0.1%。
2) 【原理/概念讲解】
老师:“高并发场景下系统易出现‘请求风暴’——大量请求瞬间涌入,导致资源(如数据库、缓存)争抢,响应延迟或服务崩溃。定位问题需从监控指标(如QPS、P99/P95响应时间、错误率、数据库慢查询数)和日志分析(慢日志、错误日志)入手。优化措施需针对瓶颈:若瓶颈在数据库,可优化索引、分库分表;若在缓存,需解决穿透/雪崩/击穿;若整体压力过大,需架构调整(如微服务拆分、消息队列异步处理)。类比:就像交通拥堵,先看哪个路口(监控指标)堵得最严重(数据库慢查询),再修路(优化)或分流(架构调整)。”
3) 【对比与适用场景】
| 缓存问题 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 缓存穿透 | 请求不存在的数据,查询数据库无结果,未缓存 | 请求直接到数据库,无缓存命中 | 高并发下查询不存在的数据(如恶意攻击) | 设置空值缓存(如Redis SETNX key "" 10,过期10秒) |
| 缓存击穿 | 高频热点数据缓存过期,大量请求同时查询 | 请求瞬间集中到数据库 | 高频访问的缓存数据 | 设置TTL+互斥锁(如Redis SET key value EX 60 NX,加锁防止并发过期) |
| 缓存雪崩 | 大量缓存同时过期,请求全部到数据库 | 数据库瞬间压力激增 | 缓存统一过期时间 | 分散过期时间(如TTL+10%随机偏移,避免同时过期) |
4) 【示例】
秒杀库存扣减流程(优化前 vs 优化后):
redis.get(skuId))→ 无select stock from product where id=123)→ 10update product set stock=9 where id=123)→ 成功redis.get(skuId))→ 有(库存10)redis.set(skuId, 9),TTL=60s+10%随机偏移)stock字段加B树索引(CREATE INDEX idx_stock ON product(stock)),分库分表(按SKU分区,如product_sku表分区键为sku_id)。{"skuId":123, "stock":10},失败重试3次后记录错误。5) 【面试口播版答案】
“在之前的项目中,我们遇到了秒杀活动的秒级高并发场景,系统响应延迟严重甚至崩溃。首先,通过监控发现P99响应时间从2秒飙升至5秒,错误率从0.1%升至5%,定位到数据库慢查询占比超80%。接着通过日志分析,发现大量请求命中了未缓存的库存查询。优化措施上,我们引入Redis分布式缓存解决缓存穿透(设置空值缓存,命令SETNX key "" 10,过期10秒),针对高频SKU分散缓存过期时间(TTL+10%随机偏移),同时为数据库stock字段加索引并分库分表(按SKU分区)。此外,架构上通过Kafka消息队列解耦请求和库存扣减,实现异步处理,并设置令牌桶限流(每秒1000个令牌,桶大小1000),防止请求过载。最终,P99响应时间降至50ms以内,系统错误率从5%降至0.1%。”
6) 【追问清单】
7) 【常见坑/雷区】