MST

星途 面试题库

面试题:缓存设计之高级难度:缓存穿透、雪崩和击穿在API网关场景下的应对策略

在缓存与API网关协同工作时,缓存穿透、雪崩和击穿问题可能严重影响系统性能。请详细描述这三个问题在API网关场景下是如何产生的,并分别说明你会采取哪些具体措施来应对这些问题,包括但不限于缓存策略调整、网关配置优化等方面。
39.3万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

缓存穿透

  1. 产生原因
    • 在API网关场景下,缓存穿透指的是客户端请求的数据在缓存和数据库中都不存在。比如恶意用户不断请求一个不存在的商品ID,每次请求都会绕过缓存直接查询数据库。由于缓存中没有该数据,数据库中也没有,所以每次请求都会给数据库带来压力,如果这类请求量很大,可能会导致数据库不堪重负甚至崩溃。
  2. 应对措施
    • 布隆过滤器:在API网关入口处使用布隆过滤器。布隆过滤器可以快速判断一个数据是否存在。当请求到达网关时,先通过布隆过滤器判断请求的数据是否可能存在。如果布隆过滤器判断不存在,直接返回,不再查询数据库。例如,在电商场景下,对商品ID构建布隆过滤器,对于明显不存在的商品ID请求直接拦截。
    • 空值缓存:当数据库查询结果为空时,也将这个空结果缓存起来,并设置较短的过期时间。这样下次相同请求到达时,虽然数据不存在,但可以从缓存中获取空值,避免查询数据库。比如查询一个不存在的用户信息,将空值缓存5分钟。

缓存雪崩

  1. 产生原因
    • 在API网关场景下,缓存雪崩是指大量的缓存数据在同一时间过期失效。例如,由于缓存服务器重启或者缓存的过期时间设置不合理,导致大量缓存数据同时过期。此时大量请求会直接穿透到数据库,数据库瞬间承受巨大压力,可能导致数据库服务不可用,进而影响整个系统的正常运行。
  2. 应对措施
    • 随机过期时间:避免设置统一的缓存过期时间,而是在一个合理的时间区间内设置随机的过期时间。比如原本设置所有缓存过期时间为1小时,可以改为在50分钟到70分钟之间随机设置过期时间。这样可以分散缓存过期的时间点,降低大量缓存同时过期的风险。
    • 缓存预热:在系统上线或者缓存重建时,提前将一些热点数据加载到缓存中,并设置不同的过期时间。这样可以避免系统启动后大量请求同时查询数据库,减少缓存雪崩的可能性。例如,电商系统上线时,提前将热门商品信息加载到缓存。
    • 多级缓存:采用多级缓存架构,比如本地缓存(如Guava Cache)和分布式缓存(如Redis)结合。当分布式缓存出现雪崩时,本地缓存可以继续提供服务,减轻数据库压力。

缓存击穿

  1. 产生原因
    • 在API网关场景下,缓存击穿是指一个热点数据在缓存中过期的瞬间,大量针对该数据的请求同时到达。由于缓存过期,这些请求都会直接查询数据库,给数据库带来很大压力。例如,某热门商品的缓存刚刚过期,而此时恰好有大量用户同时请求该商品信息,就会导致缓存击穿问题。
  2. 应对措施
    • 互斥锁:在缓存过期时,使用互斥锁(如Redis的SETNX命令实现)来保证只有一个请求可以查询数据库并更新缓存。其他请求等待锁释放后直接从缓存获取数据。例如,当热门商品缓存过期时,第一个请求获取锁并查询数据库更新缓存,其他请求等待锁,等锁释放后从缓存获取数据。
    • 永不过期:对于热点数据设置永不过期,同时通过后台线程定期更新缓存数据。比如定期在凌晨低峰期对热门商品信息进行更新,保证数据的实时性,同时避免缓存击穿问题。