欢迎光临
我们一直在努力

Java八股刷题

4. 缓存穿透、击穿、雪崩的区别?

一.定义与原因

    1. 缓存穿透(Cache Penetration)

        定义:大量请求查询不存在的数据,导致请求直接穿透缓存,直达数据库。

        原因:

            恶意攻击:如使用随机不存在的ID发起请求

            业务缺陷:未正确处理无效查询(如缓存结果为空)

        示例:请求用户ID为-1的数据(数据库中不存在)

        解决方案:

            布隆过滤器:预存所有合法键,拦截无效请求

            缓存空值:对不存在的数据缓存null,设置较短过期时间(如5分钟)

            接口限流:对高频无效请求的客户端进行限流或黑名单处理

    2. 缓存击穿(Cache Breakdown)

        定义:热点数据在缓存过期瞬间,大量并发请求直接冲击数据库

        原因:

            热点数据缓存过期,且并发请求量极大

            未使用互斥锁或异步更新机制

        示例:双十一秒杀商品信息缓存过期,瞬间数万请求涌入数据库

        解决方案:

            互斥锁(Mutex Lock):仅允许一个线程重建缓存,其他线程等待

            逻辑过期:缓存永不过期,后台异步更新数据

            热点数据预加载:提前续期缓存,避免同时失效

    3. 缓存雪崩(Cache Avalanche)

        定义:大量缓存数据同时过期或缓存服务宕机,导致所有请求涌向数据库

        原因:

            缓存数据设置相同的过期时间(如凌晨批量更新后统一失效)

            缓存集群故障(如Redis主从全挂)

        示例:促销活动结束后,所有商品缓存设置为1小时后过期,导致瞬时数据库压力激增

        解决方案:

            随机过期时间:在基础过期时间上增加随机值(如基础时间+0~300秒)

            多级缓存:本地缓存(Caffeine)结合分布式缓存(Redis),分级失效

            服务熔断降级:数据库压力过大时,触发熔断机制返回默认值

            高可用架构:Redis集群(主从+哨兵)或云托管服务(如AWS ElastiCache)

二. 对比总结

问题类型触发条件影响范围解决方案核心思路
缓存穿透 查询不存在的数据 单个或少量无效请求 拦截无效请求(布隆过滤器、缓存空值)
缓存击穿 热点数据过期+高并发 单个热点数据 避免并发重建(互斥锁+逻辑过期)
缓存雪崩 大量数据同时失效或服务宕机 全局或大范围缓存失效 分散失效时间、多级容错(多级缓存、熔断)

三.  实战建议

防御组合:布隆过滤器+空值缓存+互斥锁+随机过期时间

监控警告:实时监控缓存命中率、数据库QPS、异常时触发警告

压力测试:模拟高并发场景,验证缓存策略的有效性      

总结:

缓存穿透是查询不存在的数据绕过缓存击穿数据库;

缓存击穿是热点数据过期导致瞬间高并发请求压垮数据库;

缓存雪崩是大量缓存同时失效引发数据库连锁崩溃。

区别在与穿透因数据不存在,击穿因单点热点失效,雪崩因大规模缓存失效;

赞(0)
未经允许不得转载:171主机测评 » Java八股刷题
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址