MST

星途 面试题库

面试题:缓存设计之基于缓存的会话管理方案高级难度题

阐述在高并发场景下,基于缓存的会话管理方案中如何处理缓存穿透、缓存雪崩和缓存击穿问题,且针对每种问题提出至少两种解决方案,并分析其优缺点。
12.0万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

缓存穿透

缓存穿透指查询一个一定不存在的数据,由于缓存不命中,会直接查询数据库,若大量请求同时查询不存在的数据,会对数据库造成巨大压力。

  • 解决方案1:布隆过滤器
    • 原理:在查询数据库前,先通过布隆过滤器判断数据是否存在。布隆过滤器通过多个哈希函数对数据进行映射,将结果存储在一个位数组中,查询时同样通过哈希函数映射判断是否存在。
    • 优点:能高效判断数据是否存在,极大减少数据库查询压力,空间效率高。
    • 缺点:存在误判率,且布隆过滤器本身需要额外内存空间,数据动态变化时维护成本较高。
  • 解决方案2:空值缓存
    • 原理:当查询数据不存在时,也将空值缓存起来,并设置较短的过期时间。下次相同查询先命中缓存空值,避免穿透到数据库。
    • 优点:实现简单,能快速缓解数据库压力。
    • 缺点:会额外占用缓存空间,且设置过期时间较难,过短可能无法有效防止穿透,过长则会影响数据更新及时性。

缓存雪崩

缓存雪崩指大量缓存数据在同一时间过期,导致大量请求直接访问数据库,造成数据库压力过大甚至崩溃。

  • 解决方案1:随机过期时间
    • 原理:为缓存数据设置随机的过期时间,避免大量数据同时过期。例如,原本过期时间为1小时,可以设置在40分钟到80分钟之间随机。
    • 优点:实现简单,有效避免大量缓存同时过期的情况,分散数据库压力。
    • 缺点:难以精确控制过期时间分布,可能导致部分缓存过期时间过短或过长,影响缓存命中率。
  • 解决方案2:二级缓存
    • 原理:使用两层缓存,一级缓存设置较短过期时间,二级缓存设置较长过期时间。当一级缓存过期,先从二级缓存获取数据,若二级缓存也过期,再查询数据库并同时更新一、二级缓存。
    • 优点:降低了数据库压力,且能保证数据在一段时间内有缓存可用,提高系统可用性。
    • 缺点:增加了缓存架构复杂度,需要额外维护二级缓存,增加了内存使用。

缓存击穿

缓存击穿指一个热点key在失效瞬间,大量并发请求同时访问,直接穿透到数据库,造成数据库压力剧增。

  • 解决方案1:互斥锁
    • 原理:在查询缓存未命中时,使用互斥锁(如分布式锁)保证只有一个线程去查询数据库并更新缓存,其他线程等待,获取锁的线程更新完缓存后释放锁,其他线程再从缓存获取数据。
    • 优点:能有效防止缓存击穿,保证数据库不会被高并发请求压垮。
    • 缺点:性能上有一定损耗,因为大量线程需要等待获取锁,且可能存在死锁风险,实现分布式锁也较为复杂。
  • 解决方案2:热点数据永不过期
    • 原理:对于热点数据不设置过期时间,同时启动后台线程定时更新缓存数据,或者在数据发生变化时主动更新缓存。
    • 优点:彻底避免缓存击穿问题,保证高并发场景下热点数据始终可从缓存获取。
    • 缺点:缓存数据可能长时间不更新导致数据不一致,后台更新逻辑增加了系统复杂度,且占用更多缓存资源。