Redis缓存更新面试题解析,缓存穿透、雪崩、击穿如何应对?

文章导读
结论:应对Redis缓存穿透、雪崩、击穿,可通过设置无效key缓存、错峰过期时间、互斥锁或热点数据永不过期等简单方法结合使用来有效防止。
📋 目录
  1. Redis缓存更新面试题解析,缓存穿透、雪崩、击穿如何应对?
  2. 缓存穿透及应对方法
  3. 缓存雪崩及应对方法
  4. 缓存击穿及应对方法
  5. 缓存更新策略
  6. FAQ
  7. 引用来源
A A

Redis缓存更新面试题解析,缓存穿透、雪崩、击穿如何应对?

结论:应对Redis缓存穿透、雪崩、击穿,可通过设置无效key缓存、错峰过期时间、互斥锁或热点数据永不过期等简单方法结合使用来有效防止。

缓存穿透及应对方法

缓存穿透指的是查询一个根本不存在的数据,导致请求直接打到数据库,给数据库造成压力。比如恶意攻击者不断请求一个不存在的用户ID。解决起来很简单:如果查询数据库后发现数据不存在,就在Redis中缓存一个空值(如null),并设置一个较短的过期时间(比如5分钟)。这样后续同样的请求就会在缓存层被拦截,避免频繁查询数据库。另外,可以使用布隆过滤器提前过滤掉无效请求,但布隆过滤器稍微复杂一点,日常用空值缓存就够用了。

缓存雪崩及应对方法

缓存雪崩是指大量缓存数据在同一时间过期失效,导致所有请求瞬间涌向数据库,数据库可能扛不住而崩溃。应对方法是不要让所有缓存同时过期:可以给每个缓存数据设置一个随机的过期时间,比如原本计划缓存1小时,现在可以在1小时的基础上加减几分钟的随机值,这样就能错开失效时间。另一种做法是使用“热点数据永不过期”策略,对特别重要的数据不设置过期时间,而是通过后台定时任务定期更新缓存。如果已经发生雪崩,可以暂时限流,只放部分请求去查数据库,保护数据库不崩溃。

缓存击穿及应对方法

缓存击穿是指某个热点数据过期时,大量请求同时来查这个数据,导致数据库压力激增。这就像一扇门突然被很多人挤开。常用方法是“加锁”:当发现缓存失效时,只让一个线程去数据库查询并重建缓存,其他线程等待锁释放后直接从缓存获取数据。在Redis中可以用setnx命令实现简单的分布式锁。另一种更直接的做法是对热点数据设置永不过期,然后通过后台程序异步更新缓存。实际开发中,加锁方式更稳妥,可以避免多个线程重复查库。

Redis缓存更新面试题解析,缓存穿透、雪崩、击穿如何应对?

缓存更新策略

除了应对问题,正确更新缓存也很关键。常见策略有:先更新数据库再删除缓存(Cache Aside模式),或者使用消息队列异步更新。简单场景下,直接删除旧缓存,让下次请求时重新从数据库加载并缓存就行。注意更新和删除操作要保证原子性,避免脏数据。如果业务允许,可以设置较短的缓存时间,让数据定期自动刷新。

FAQ

问:缓存穿透和缓存击穿有什么区别?
答:缓存穿透是查不存在的数据,一直打数据库;缓存击穿是热点数据过期瞬间被大量请求,区别在于数据是否存在以及是否热点。

Redis缓存更新面试题解析,缓存穿透、雪崩、击穿如何应对?

问:布隆过滤器怎么用于防穿透?
答:布隆过滤器可以预先存储所有可能存在的key(如有效用户ID),请求来时先检查key是否在过滤器中,如果不在就直接返回,避免查缓存和数据库。但布隆过滤器有误判率,且需要维护。

问:如何发现系统中出现了缓存雪崩?
答:通常表现为数据库监控指标(如CPU、连接数)突然飙升,同时缓存命中率骤降,请求响应变慢。可以通过日志或监控工具设置告警来及时发现。

引用来源

1. 《Redis设计与实现》——黄健宏著,人民邮电出版社,2014年。
2. Redis官方文档:https://redis.io/documentation
3. 高并发系统设计相关实践文章及社区经验总结。