MST

星途 面试题库

面试题:缓存设计之中等难度:缓存击穿的应对策略

在后端开发中,缓存击穿是指一个热点 key 在缓存过期的瞬间,大量请求同时访问数据库,造成数据库压力过大。请阐述至少两种应对缓存击穿的策略,并说明每种策略的优缺点。
15.2万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

1. 互斥锁策略

  • 实现方式:在缓存失效时,先获取一个互斥锁(如 Redis 的 SETNX 命令),只有获取到锁的请求才能查询数据库并更新缓存,其他请求等待。获取锁的请求更新完缓存后释放锁,其他等待的请求再次尝试获取锁(此时缓存已更新,一般能直接从缓存获取数据)。
  • 优点:实现相对简单,能有效防止大量请求同时访问数据库。
  • 缺点:存在锁竞争,可能导致部分请求等待时间过长,降低系统的并发性能。如果获取锁的请求处理时间过长,会影响后续请求的响应时间。

2. 热点数据永不过期策略

  • 实现方式:对热点数据不设置过期时间,同时开启一个后台线程,定时去更新这些热点数据的缓存。或者在数据发生变化时主动更新缓存。
  • 优点:避免了缓存过期瞬间的大量数据库请求,保证了系统的稳定性和高并发性能。
  • 缺点:占用更多的缓存空间,因为热点数据长期占用缓存。而且如果后台更新线程出现问题或者数据更新不及时,可能导致缓存数据与数据库数据不一致的时间较长。

3. 二级缓存策略

  • 实现方式:使用两层缓存,第一层缓存设置较短的过期时间,第二层缓存设置较长的过期时间。当第一层缓存失效时,先从第二层缓存获取数据返回给客户端,同时启动异步线程去更新第一层缓存(从数据库获取最新数据)。
  • 优点:能在一定程度上减少数据库压力,即使第一层缓存失效,还有第二层缓存兜底,减少直接访问数据库的概率。异步更新第一层缓存也能避免阻塞请求。
  • 缺点:增加了缓存的复杂度和维护成本,需要管理两层缓存。如果第二层缓存也失效,还是可能出现缓存击穿问题,只不过概率相对较低。