什么是缓存击穿、缓存穿透、缓存雪崩?

缓存击穿

定义

缓存击穿是指某个热点数据在缓存中失效后,大量请求同时访问数据库,导致数据库压力剧增,甚至崩溃。

问题描述

热点数据:某些数据被频繁访问,成为热点数据。

缓存失效:热点数据在缓存中过期或被删除。

大量请求:在缓存失效的瞬间,大量请求直接打到数据库,导致数据库压力剧增。

解决方案

互斥锁(Mutex):在缓存失效时,使用互斥锁确保只有一个请求去数据库获取数据,其他请求等待。

设置永不过期:对于热点数据,可以设置较长的过期时间或永不过期,减少缓存失效的频率。

预热缓存:在系统启动或维护窗口期间,提前加载热点数据到缓存中。

缓存穿透

定义

缓存穿透是指查询一个不存在的数据,由于缓存中没有该数据,请求直接打到数据库,而数据库中也没有该数据,导致每次请求都必须查询数据库。

问题描述

无效查询:客户端查询一个不存在的数据。

缓存未命中:缓存中没有该数据。

数据库未命中:数据库中也没有该数据。

频繁请求:每次请求都必须查询数据库,增加数据库负担。

解决方案

返回空对象:对于查询不存在的数据,可以在缓存中存储一个特殊的空对象(如 null 或自定义的空对象),并设置较短的过期时间。

布隆过滤器:使用布隆过滤器(Bloom Filter)预先判断数据是否存在,减少无效查询。

缓存雪崩

定义

缓存雪崩是指大量缓存数据在同一时间失效,导致大量请求同时打到数据库,数据库压力剧增,甚至崩溃。

问题描述

集中失效:多个缓存数据设置相同的过期时间,导致在同一时间点大量缓存失效。

大量请求:缓存失效后,大量请求直接打到数据库,增加数据库负担。

解决方案

分散过期时间:为缓存数据设置随机的过期时间,避免大量缓存同时失效。

限流降级:在缓存失效时,使用限流策略限制请求频率,防止数据库过载。

多级缓存:使用多级缓存(如本地缓存 + 分布式缓存),减少对数据库的直接访问。

总结

缓存击穿:热点数据缓存失效后,大量请求直接打到数据库。解决方案包括使用互斥锁、设置永不过期和预热缓存。

缓存穿透:查询不存在的数据,每次请求都必须查询数据库。解决方案包括返回空对象和使用布隆过滤器。

缓存雪崩:大量缓存数据在同一时间失效,导致大量请求直接打到数据库。解决方案包括分散过期时间、限流降级和多级缓存。

通过合理的设计和配置,可以有效避免这些缓存问题,提高系统的性能和稳定性。