一文搞懂缓存雪崩、击穿、穿透,火爆了!

发布时间:2026/6/28 2:57:14

一文搞懂缓存雪崩、击穿、穿透,火爆了! 为什么需要缓存数据库磁盘 I/O 慢用户数据一般持久化在关系型数据库中磁盘读写速度远低于内存。Redis 缓存层提速将热点数据放入内存数据库Redis读写速度有了很大提升极大提高系统性能。其查询流程如下图虽然引入缓存后解决了性能问题但新的问题会随之而来可能会出现缓存雪崩、缓存击穿、缓存穿透。缓存雪崩缓存雪崩指的是当大量缓存 key 在同一时刻失效或 Redis 节点故障宕机导致原本要将请求打到缓存上的请求全部打到数据库瞬间压垮关系型数据库结果引发连锁反应系统崩溃。其缓存雪崩的可能如下大量 key 同时过期相同 TTLRedis 宕机单点或集群故障大量key同时过期为了缓存和数据库的数据一致性通常给缓存设置key过期时间。如果一批 key 使用相同或非常接近的过期时间到期时这些 key 会一起过期。解决方案均匀设置过期时间给TTL加一个随机偏移如 TTL base random(0, spread)互斥锁缓存未命中时只允许一个线程构建缓存其余等待或返回默认值后台更新缓存缓存不设 TTL由后台线程定时或事件驱动刷新互斥锁的方案流程图如下Redis 宕机Redis的单节点或集群出现故障导致缓存层失效将所有请求直接打到数据库。服务熔断检测到 Redis 不可用时业务直接返回错误不再访问数据库请求限流只允许少量请求访问数据库其余在入口拒绝构建高可用集群Redis 主从 哨兵/Cluster主节点故障自动切换服务熔断与请求限流的比较如下缓存击穿在平常高并发的系统中大量的请求同时查询一个 key 时此时这个key正好失效了就会导致大量的请求都打到数据库上面去。这种现象我们称为缓存击穿。解决方案如下互斥锁同一时刻只允许一个线程重建缓存其余等待或返回默认值给热点数据不设置过期时间热点 key 永不过期由后台线程定期或在即将过期前主动刷新缓存击穿和缓存雪崩的区别缓存雪崩大量 key 同时失效缓存击穿单个热点 key 失效缓存穿透请求的数据既不在缓存中也不在数据库中每次请求都会穿过缓存直接查数据库且无法构建缓存导致数据库压力剧增。其解决方案如下非法请求限制在 API 入口校验参数合法性拦截明显非法请求缓存空值或默认值当数据库查不到时在缓存中写一个空值如 NULL并设较短 TTL布隆过滤器在写入数据库时同步写入布隆过滤器请求先查布隆过滤器判断是否存在布隆过滤器在请求链路中的位置好了缓存雪崩、缓存击穿、缓存穿透就分享到这里

相关新闻