面试题答案
一键面试可能导致性能瓶颈的原因
- Redis缓存穿透:大量不存在的查询请求穿过Redis直接访问MySQL,增加MySQL压力。
- Redis缓存雪崩:缓存中大量数据在同一时间过期,导致大量请求瞬间涌向MySQL。
- MySQL查询慢:数据库索引不合理,复杂查询语句未优化,数据量过大导致全表扫描等。
- 网络延迟:高并发下网络传输数据量巨大,产生延迟,影响数据获取速度。
优化方案
- 解决缓存穿透
- Redis方面:使用布隆过滤器,在Redis之前拦截不存在的数据请求。将所有可能存在的数据哈希到一个足够大的bitmap中,查询时先通过布隆过滤器判断数据是否存在,不存在则直接返回,不穿透到MySQL。
- MySQL方面:对穿透过来的不存在数据请求进行记录分析,看是否有恶意攻击等异常情况,可对异常IP进行限制访问。
- 解决缓存雪崩
- Redis方面:设置缓存过期时间时,添加一个随机值,让缓存过期时间分散,避免集中过期。例如原本设置过期时间为60分钟,可设置为55 - 65分钟之间的随机值。
- MySQL方面:增加MySQL的负载能力,如进行主从复制,读写分离,让读请求分散到从库,减轻主库压力,避免大量请求瞬间压垮MySQL。
- 优化MySQL查询
- Redis方面:对经常变动的数据,可以采用缓存更新策略,比如双写模式(先更新MySQL,再更新Redis)或失效模式(先更新MySQL,再删除Redis缓存),保证数据一致性,减少因数据不一致导致的查询异常。
- MySQL方面:优化SQL语句,使用执行计划分析查询语句,添加合适的索引。对于大表数据,进行分库分表操作,降低单表数据量,提高查询效率。
- 减少网络延迟
- Redis方面:采用更高效的网络协议,如Redis 6.0引入的RESP3协议,相比之前协议能更高效处理网络数据。同时合理配置Redis的连接池,减少连接创建销毁开销。
- MySQL方面:将MySQL和Redis部署在距离较近的服务器,降低网络物理距离。优化MySQL的网络配置,如调整TCP参数,提高网络传输效率。