MST
星途 面试题库

面试题:缓存设计 - 高并发下缓存与搜索引擎的优化挑战及解决方案

在高并发访问场景下,缓存与搜索引擎集成面临诸如缓存雪崩、缓存穿透、一致性哈希分布不均等挑战。请详细阐述你对这些问题的理解,并给出针对每种问题的有效解决方案,同时说明这些方案在实际应用中的优缺点及适用场景。
32.0万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

缓存雪崩

  1. 问题理解:在高并发场景下,大量缓存数据在同一时间过期失效,导致这些请求直接访问数据库,使数据库瞬间承受巨大压力,可能引发数据库崩溃。
  2. 解决方案
    • 随机过期时间:给缓存设置一个随机的过期时间,避免大量缓存同时过期。例如原本缓存过期时间为60分钟,现在设置为55 - 65分钟之间的随机值。
    • 互斥锁:当缓存失效时,先获取锁,只有拿到锁的请求才能去查询数据库并更新缓存,其他请求等待。锁释放后,其他请求从缓存获取数据。
  3. 优缺点及适用场景
    • 随机过期时间
      • 优点:实现简单,能有效打散缓存过期时间,降低数据库压力。
      • 缺点:难以精确控制缓存过期时间,可能存在部分数据提前过期或过期时间过长导致数据不实时的情况。
      • 适用场景:对数据实时性要求不是特别高,缓存数据相对稳定的场景,如商品介绍页面缓存。
    • 互斥锁
      • 优点:能保证同一时间只有一个请求访问数据库,有效保护数据库。
      • 缺点:引入锁机制可能导致性能下降,特别是高并发场景下锁竞争激烈,还可能出现死锁问题。
      • 适用场景:适用于对数据一致性要求较高,数据库处理能力相对有限的场景,如库存数据缓存。

缓存穿透

  1. 问题理解:指查询一个一定不存在的数据,由于缓存和数据库都没有,导致请求每次都穿透到数据库,若恶意攻击者利用此漏洞发起大量请求,会使数据库压力过大甚至崩溃。
  2. 解决方案
    • 布隆过滤器:在缓存之前增加布隆过滤器,将所有可能存在的数据哈希到一个足够大的位数组中,查询时先通过布隆过滤器判断数据是否存在,若不存在则直接返回,不会访问数据库。
    • 空值缓存:当查询数据库发现数据不存在时,也将空值缓存起来,并设置较短的过期时间,后续相同请求直接从缓存获取空值,不再访问数据库。
  3. 优缺点及适用场景
    • 布隆过滤器
      • 优点:能高效过滤掉不存在的数据,避免大量无效请求穿透到数据库,性能高且空间效率高。
      • 缺点:存在误判率,即可能将不存在的数据误判为存在,但可以通过调整位数组大小和哈希函数来降低误判率;新增数据时需要更新布隆过滤器。
      • 适用场景:适用于数据量较大且相对固定,对误判率有一定容忍度的场景,如电商商品ID查询。
    • 空值缓存
      • 优点:实现简单,能快速拦截不存在数据的请求。
      • 缺点:会占用额外的缓存空间,且缓存空值的过期时间不好把控,若设置过长可能影响业务逻辑,过短则无法有效避免缓存穿透。
      • 适用场景:适用于数据更新频繁,且对缓存空间占用不太敏感的场景,如新闻资讯详情查询。

一致性哈希分布不均

  1. 问题理解:一致性哈希算法在节点较少时,可能会出现数据分布不均匀的情况,导致部分节点负载过高,而部分节点负载过低,影响系统整体性能。
  2. 解决方案
    • 虚拟节点:引入虚拟节点,将每个物理节点映射为多个虚拟节点,在计算哈希值时,对虚拟节点进行操作,这样可以使数据分布更加均匀。例如,每个物理节点映射为100个虚拟节点,哈希环上有更多的点可供分配,从而使数据分布更均匀。
  3. 优缺点及适用场景
    • 虚拟节点
      • 优点:能有效解决一致性哈希分布不均的问题,提高系统整体性能和资源利用率,在增加或减少节点时,数据迁移量相对较小。
      • 缺点:增加了系统的复杂性,需要维护物理节点和虚拟节点的映射关系;虚拟节点过多会增加内存消耗。
      • 适用场景:适用于对系统性能和扩展性要求较高的大规模分布式缓存系统,如大型电商的分布式缓存集群。