面试题:Redis 中的缓存击穿、缓存穿透和缓存雪崩是什么?

在使用 Redis 作为缓存系统时,经常会遇到一些与缓存相关的典型问题,包括缓存击穿、缓存穿透和缓存雪崩。了解这些问题及其解决方案对于构建高效稳定的缓存系统至关重要。

缓存击穿(Cache Breakdown)

定义:缓存击穿指的是一个非常热点的数据在缓存中过期的瞬间,大量并发请求直接打到数据库上,导致数据库压力骤增的现象。

原因

  • 某些数据访问频率极高,但恰好这些数据的缓存有效期到了。
  • 当这些数据的缓存失效时,所有对该数据的请求都会直接落到数据库上,造成瞬时高负载。

解决方案

  • 互斥锁策略:当某个热点数据过期后,第一个到达的请求获取分布式锁,然后从数据库加载数据并更新缓存。其他请求则等待该请求完成后再从缓存读取数据。
  • 设置永不过期:虽然看起来违反了缓存的有效性原则,但在某些特定场景下可以考虑将特别热门的数据设置为永不过期,并通过后台任务定期刷新缓存内容。
  • 异步更新策略:可以在缓存即将过期前主动触发数据更新流程,避免缓存过期瞬间产生大量请求。

缓存穿透(Cache Penetration)

定义:缓存穿透是指查询一个根本不存在的数据,由于缓存是不命中且不会存储该结果,因此每次请求都会去数据库查询,导致无效的数据库访问。

原因

  • 客户端可能错误地请求了一个不存在的数据。
  • 攻击者故意构造请求来攻击系统,试图耗尽数据库资源。

解决方案

  • 布隆过滤器(Bloom Filter):用于快速判断一个元素是否在一个集合内,可以有效防止对数据库的无效查询。
  • 缓存空对象:即使查询结果为空,也将其缓存起来,并设置较短的过期时间。这样可以减少数据库的压力,但需要注意控制好缓存时间以避免占用过多缓存空间。

缓存雪崩(Cache Avalanche)

定义:缓存雪崩是指在某一时刻,缓存中的大量 key 同时过期,导致大量的请求同时打到数据库,造成数据库崩溃的情况。

原因

  • 大量缓存数据设置了相同的过期时间,在同一时刻集中失效。
  • 系统重启或网络故障等原因导致整个缓存层失效。

解决方案

  • 随机化过期时间:为每个缓存数据设置不同的过期时间,避免大量缓存同时失效。例如,可以在基础过期时间上加上一个小范围内的随机值。
  • 多级缓存机制:除了主缓存外,还可以引入本地缓存作为二级缓存,减轻缓存雪崩的影响。
  • 持久化缓存:利用 Redis 的持久化功能(如 RDB 或 AOF),在 Redis 重启后能够迅速恢复数据,减少全量缓存重建的压力。

理解这三种现象以及它们产生的原因和解决方法,可以帮助我们在设计缓存系统时更好地预防潜在的问题,确保系统的稳定性和高效性。

THE END
喜欢就支持一下吧
点赞13 分享