缓存的雪崩,穿透,击穿的处理方案

ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花

在分布式缓存架构中,缓存雪崩、缓存穿透、缓存击穿是导致缓存失效、数据库压力暴增甚至服务宕机的三大高频痛点。三者成因不同、表现各异,处理方案需针对性设计,同时搭配分层防护策略,才能彻底规避风险。下文先明确各问题定义与根源,再详解全场景处理方案。

一、缓存雪崩:大面积缓存失效,数据库被压垮

1. 问题定义与核心成因

缓存雪崩指大量缓存数据在同一时间集中失效,或缓存服务整体宕机,导致海量请求直接绕过缓存直击底层数据库,瞬间打爆数据库连接池、CPU和IO,引发服务雪崩。

核心成因:

  • 缓存集中过期:批量数据设置了相同过期时间,到期后集体失效,请求瞬间击穿缓存
  • 缓存服务宕机:Redis单机/集群故障、网络抖动,导致整个缓存层不可用
  • 流量突发冲击:大促、热点事件等突发流量,叠加缓存失效,放大数据库压力

2. 全链路处理方案

(1)基础方案:规避缓存集中失效

  • 过期时间随机打散:给缓存过期时间添加随机偏移量(如基础30分钟+0-300秒随机值),避免批量数据同一时间过期,将失效压力均匀分散
  • 分级过期策略:核心数据、热点数据设置更长过期时间,非核心数据缩短过期时间,差异化管控失效风险

(2)进阶方案:保障缓存高可用

  • Redis集群部署:采用主从+哨兵、Redis Cluster集群架构,避免单机故障导致整个缓存层瘫痪,实现故障自动切换
  • 多级缓存架构:搭建「本地缓存(Caffeine/Guava)+ 分布式缓存(Redis)」双层架构,分布式缓存失效时,本地缓存可临时承接流量
  • 缓存预热:服务启动、大促前提前将热点数据加载到缓存,避免冷启动时缓存空窗期

(3)兜底方案:保护数据库不被打垮

  • 接口限流+熔断:通过Sentinel、Hystrix等组件对接口做限流、熔断,超出数据库承载能力的请求直接拒绝或降级返回
  • 互斥锁(分布式锁):缓存失效时,通过Redis分布式锁(Redlock、SETNX)控制数据库查询并发度,同一时间只允许一个请求查询DB并重建缓存
  • 数据库连接池管控:合理设置数据库最大连接数,避免连接耗尽导致整个数据库服务不可用

二、缓存穿透:查询不存在数据,缓存彻底失效

1. 问题定义与核心成因

缓存穿透指请求查询缓存和数据库中都不存在的数据,缓存无法命中,每次请求都会直接访问数据库,相当于缓存层被完全绕过。恶意攻击(频繁查询非法ID)、业务异常查询是主要诱因,长期会耗尽数据库资源。

2. 全链路处理方案

(1)基础方案:拦截无效请求

  • 前端/接口参数校验:对请求ID、参数做合法性校验,过滤非法、空值、格式错误的请求,从源头拦截恶意查询
  • 接口限流:对单IP、单用户做限流管控,遏制恶意批量穿透请求

(2)核心方案:缓存空值/默认值

查询数据库无结果时,将空值、默认值存入缓存,设置较短过期时间(如30秒-5分钟),后续相同请求直接命中缓存空值,避免反复查库。注意控制过期时间,防止脏数据长期滞留。

(3)进阶方案:布隆过滤器拦截

提前将数据库中存在的合法key存入布隆过滤器,请求到来时先过过滤器:过滤器判定不存在的key,直接拒绝请求,无需查询缓存和数据库。适合数据量较大、变更不频繁的场景,需注意布隆过滤器的误判率优化。

(4)兜底方案:黑名单机制

针对高频恶意穿透的IP、非法key,加入黑名单,短期内直接拦截请求,进一步降低数据库压力。

三、缓存击穿:热点Key过期,单Key并发击穿

1. 问题定义与核心成因

缓存击穿单个热点Key过期失效,瞬间海量并发请求集中访问该Key,缓存无法命中,所有请求直击数据库,导致单库压力过载。区别于雪崩(大面积失效)和穿透(查不存在数据),击穿是单点热点+并发突增导致的局部故障。

2. 全链路处理方案

(1)核心方案:热点Key永不过期

针对秒杀、热搜等极致热点Key,不设置物理过期时间,通过后台异步线程定时更新缓存数据,既保证数据时效性,又彻底规避过期击穿风险。适合并发极高、数据一致性要求适中的场景。

(2)基础方案:分布式互斥锁

热点Key过期时,利用Redis分布式锁(SETNX、Redisson)控制并发:只有第一个请求能获取锁并查询数据库、重建缓存,其余请求等待锁释放后重新查询缓存,避免大量并发同时查库。

(3)优化方案:热点Key预热+续期

  • 热点Key提前预热:大促、活动前主动将热点Key加载到缓存,避免冷启动过期
  • 主动续期机制:检测到热点Key即将过期时,异步提前刷新过期时间,防止自然失效

(4)兜底方案:本地缓存兜底

将热点Key同步缓存到本地内存(如Caffeine),分布式缓存失效时,本地缓存临时承接流量,降低数据库直击概率。

四、三大问题防护总结

缓存防护核心逻辑:预防为主、兜底为辅、分层管控。雪崩防大面积失效、穿透防无效查询、击穿防单点热点,搭配限流、熔断、多级缓存、分布式锁等通用手段,可彻底解决缓存三大痛点,保障缓存层和数据库的高可用。

实际业务中需根据场景选型:高并发热点场景优先用永不过期+预热;防恶意攻击优先用布隆过滤器+参数校验;通用场景优先用随机过期+分布式锁,兼顾成本和稳定性。

ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花

Redis生产 文章被收录于专栏

聚焦Redis 生产环境实战,从问题现象、根因分析、排查流程、解决方案、预防机制五大维度,系统拆解 Redis 线上高频故障与性能瓶颈,提供可直接落地的运维、开发与调优方案,助力构建高可用、高性能、高可靠的 Redis 服务体系

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务