Redis缓存穿透和雪崩(面试高频)

📅 2026/8/9 17:04:37
Redis缓存穿透和雪崩(面试高频)
1、什么是缓存穿透缓存穿透的概念很简单用户想要查询一个数据发现redis内存数据库没有也就是缓存没有命中于是向持久层数据库查询。发现也没有于是本次查询失败。当用户很多的时候缓存都没有命中于是都去请求了持久层数据库。这会给持久层数据库造成很大的压力这时候就相当于出现了缓存穿透。缓存穿透是指缓存和数据库中都没有的数据2、缓存穿透的解决方案布隆过滤器:布隆过滤器是一种数据结构对所有可能查询的参数以hash形式存储在控制层先进行校验不符合则丢弃从而避免了对底层存储系统的查询压力在访问缓存层和存储层之前将存在的key用布隆过滤器提前保存起来做第一层拦截当收到一个对key请求时先用布隆过滤器验证是key否存在如果存在在进入缓存层、存储层。可以使用bitmap做布隆过滤器。这种方法适用于数据命中不高、数据相对固定、实时性低的应用场景代码维护较为复杂但是缓存空间占用少。优点内存占用较少没有多余key 缺点实现复杂存在误判缓存空对象:缓存空对象是指在持久层没有命中的情况下对key进行set(key,)当存储层不命中后即使返回的空对象也将其缓存起来同时会设置一个过期时间之后再访问这个数据将会从缓存中获取保护了后端数据源优点简单缺点消耗内存可能会发生不一致的问题(如果后面数据库插入了之前不存在的数据)3、什么是缓存击穿缓存击穿是指缓存中没有但数据库中有的数据一般是缓存时间到期这时由于并发用户特别多同时读缓存没读到数据又同时去数据库去取数据引起数据库压力瞬间增大造成过大压力。在缓存失效的瞬间有大量的请求并发访问这类数据一般是热点数据由于缓存过期会同时访问数据库来查询最新数据造成后端负载加大甚至可能会让应用崩溃。例如:一个秒杀的场景同时几万个用户同时抢购缓存中没有数据几万个用户会同时去查询数据 可能会造成服务器宕机。4、缓存击穿解决方案1、设置热点数据永不过期从缓存层面来看没有设置过期时间所以不会出现热点 key 过期后产生的问题。2、分布式互斥锁分布式锁使用分布式锁保证对于每个key同时只有一个线程去查询后端服务该线程查询数据完成后重建缓存set(key,value,timeout)。其他线程没有获得分布式锁的权限因此只需要等待即可。等待缓存重构完成后重新从缓存获取数据即可。5、什么是缓存雪崩缓存雪崩是指在某一个时间段缓存集中过期失效。Redis宕机。由于缓存层承载着大量请求有效地保护了存储层但是如果缓存层由于某些原因不可宕机或者大量缓存由于超时时间相同在同 一时间段失效大批key失效/热点数据失效大量请求直接到达存储层存储层压力过大导致系统雪崩。案例:马上就要到双十二零点很快就会迎来一波抢购这波商品时间比较集中的放入了缓存假设缓存一个小时。那么到了凌晨一点钟的时候这批商品的缓存就都过期了。而对这批商品的访问查询都落到了数据库上对于数据库而言就会产生周期性的压力波峰。于是所有的请求都会达到存储层存储层的调用量会暴增造成存储层也会挂掉的情况。6、缓存雪崩解决方案1、可以把缓存层设计成高可用的即使个别节点、个别机器、甚至是机房宕掉依然可以提供服务。利用sentinel或cluster实现。2、 采用多级缓存本地进程作为一级缓存redis作为二级缓存不同级别的缓存设置的超时时间不同即使某级缓存过期了也有其他级别缓存兜底3、 缓存的过期时间用随机值尽量让不同的key的过期时间不同