Redis缓存雪崩、缓存击穿、缓存穿透详解

 更新时间:2025年07月22日 09:11:23   作者:在成都搬砖的鸭鸭  
本文介绍了缓存雪崩、击穿、穿透三种问题:雪崩因大量缓存同时失效导致数据库压力激增,需差异化TTL、多级缓存及熔断机制;击穿由热点key失效引发,可用互斥锁、逻辑过期或预加载;穿透则因非法查询穿透缓存,需布隆过滤器、空对象或参数校验

1、缓存雪崩

【1】定义

大量缓存数据在同一时间失效,导致所有请求直接打到数据库,引发数据库瞬时高负载甚至崩溃

【2】原因

1、缓存数据设置了相同的过期时间

2、缓存服务宕机

【3】解决方案

[1]差异化过期时间

在基础TTL上增加随机值,避免同时失效

[2]多级缓存

结合本地缓存和分布式缓存,本地缓存失效后回源到分布式缓存

[3]熔断降级

监控数据库负载,超过阈值时触发熔断(如返回默认值或限流)

[4]缓存永不过期+异步更新

缓存不设TTL,通过后台任务定期更新(适合低频变更数据)

2、缓存击穿

【1】定义

某个热点key突然失效,大量并发请求直接穿透到数据库,导致数据库压力激增

【2】原因

1、热点key过期

2、恶意请求故意攻击高频访问的key

【3】解决方案

[1]互斥锁

第一个请求发现缓存失效时,加锁(如Redis SETNX),从数据库加载数据后释放锁,其它请求等待或轮询

[2]逻辑过期

1、缓存永不过期,但存储数据时附加一个过期时间字段

2、发现数据逻辑过期时,触发异步更新

[3]热点数据加载

监控热点key,在接近过期时提前刷新缓存

3、缓存穿透

【1】定义

查询不存在的数据(如非法ID、恶意攻击),导致请求绕过缓存直接访问数据库

【2】原因

1、业务逻辑漏洞(如未校验参数合法性)

2、恶意攻击(如爬虫伪造不存在的ID)

【3】解决方案

[1]缓存空对象

对查询不到的数据,混存一个空值,并设置较短TTL

[2]布隆过滤器

在缓存层前加布隆过滤器,快速判断key是否存在:若布隆过滤器返回不存在,直接拒绝请求;若返回可能存在,继续查询缓存/数据库

[3]参数校验

对请求参数做合法性校验

4、对比总结

问题触发条件核心解决方案
缓存雪崩大量key同时失效差异化TTL、多级缓存、熔断降级
缓存击穿单个热点key失效互斥锁、逻辑过期、预加载
缓存穿透查询不存在的数据布隆过滤器、控制缓存、参数校验

5、最佳实践

1、监控与告警:实时监控缓存命中率、数据库QPS,设置阈值告警

2、压测模拟:通过模拟雪崩/击穿场景,验证解决方案的可靠性

3、组合策略:根据业务场景混合使用上述方案

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Redis远程字典服务器 hash类型示例详解

    Redis远程字典服务器 hash类型示例详解

    这篇文章主要介绍了Redis远程字典服务器 hash类型示例详解,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • 详解Redis集群搭建的三种方式

    详解Redis集群搭建的三种方式

    Redis是一个开源的key-value存储系统,大部分互联网企业都用来做服务器端缓存。Redis在3.0版本前只支持单实例模式,虽然支持主从模式、哨兵模式部署来解决单点故障,但是现在互联网企业动辄大几百G的数据,没法满足业务的需求,所以Redis在3.0版本以后就推出了集群模式。
    2021-05-05
  • Redis常见数据类型List列表使用详解

    Redis常见数据类型List列表使用详解

    Redis的List是一种有序的字符串集合,支持两端高效插入和删除,适用于队列和栈,这篇文章主要介绍了Redis常见数据类型List列表使用的相关资料,需要的朋友可以参考下
    2024-12-12
  • 一文了解发现并解决Redis热key与大key问题

    一文了解发现并解决Redis热key与大key问题

    热key是服务端的常见问题,本文主要介绍Redis热key与大key问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • Redis分布式锁的超时机制实现的方法示例

    Redis分布式锁的超时机制实现的方法示例

    本文介绍了Redis分布式锁中超时机制的关键作用,通过设置锁的过期时间防止客户端崩溃导致的死锁问题,具有一定的参考价值,感兴趣的可以了解一下
    2025-10-10
  • Python利用redis限制用户重复刷新带来的数据问题

    Python利用redis限制用户重复刷新带来的数据问题

    在网站开发中,我们经常会遇到需要控制用户重复刷新页面的情况,本文就来介绍了Python利用redis限制用户重复刷新带来的数据问题,感兴趣的可以了解一下
    2024-03-03
  • 基于Redis实现短信验证码登录功能

    基于Redis实现短信验证码登录功能

    对于我们用户来讲,我们在登陆一个APP的时候,有很多种登陆方式,比如"微信扫码"、"手机号登陆"、"支付宝扫码"、"账号密码登录",现在大多都会要求微信扫码登录或者是手机号验证码登录,所以本文给大家介绍了基于Redis实现短信验证码登录功能,需要的朋友可以参考下
    2025-01-01
  • Redis+IDEA实现单机锁和分布式锁的过程

    Redis+IDEA实现单机锁和分布式锁的过程

    这篇文章主要介绍了Redis+IDEA实现单机锁和分布式锁的过程,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • 深入浅析Redis 集群伸缩原理

    深入浅析Redis 集群伸缩原理

    Redis 集群提供了灵活的节点扩容和收缩方案。在不影响集群对外服务的情况下,可以为集群添加节点进行扩容,也可以下线部分节点进行缩容,接下来通过本文给大家分享Redis 集群伸缩原理,感兴趣的朋友一起看看吧
    2021-05-05
  • 详解三分钟快速搭建分布式高可用的Redis集群

    详解三分钟快速搭建分布式高可用的Redis集群

    这篇文章主要介绍了详解三分钟快速搭建分布式高可用的Redis集群,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02

最新评论