当前位置: 首页 > news >正文

【Redis】缓存穿透、缓存击穿、缓存雪崩

在分布式系统和高并发场景中,缓存机制是提高系统性能的重要手段。
然而,缓存在某些情况下会出现三种典型的异常现象:缓存穿透缓存击穿缓存雪崩


1. 缓存穿透

现象

查询的数据在缓存和数据库中都不存在,每次请求都直接打到数据库,导致数据库压力陡增。

原因

  • 恶意攻击或爬虫发送大量无效请求。
  • 缓存层未对空值或错误结果进行缓存。

解决方案

  1. 缓存空值:即使数据库返回空值,也写入缓存并设置短暂过期时间。
    if result == nil {
        redis.Set("key", "null", 60*time.Second)
    }
    
  2. 布隆过滤器:提前判断 Key 是否存在。
  3. 接口限流和黑名单

2. 缓存击穿

现象

热点数据(访问量极高的数据)在缓存过期瞬间,大量请求同时打到数据库,导致数据库崩溃。

原因

  • 缓存失效导致瞬时请求全部涌向数据库。
  • 高并发环境下缺乏对缓存重建的控制。

解决方案

  1. 设置热点数据永不过期,只通过手动更新缓存。
  2. 加互斥锁:只允许一个线程更新缓存,其他线程等待。
    lockKey := "lock_key"
    if !redis.SetNX(lockKey, 1, 10*time.Second).Val() {
        time.Sleep(50 * time.Millisecond)
    }
    
  3. 提前缓存预热:在缓存即将过期时,提前触发缓存更新。

3. 缓存雪崩

现象

大量缓存同时失效,导致瞬时请求全部打到数据库,数据库压力暴增。

原因

  • 缓存数据集中设置了相同的过期时间。
  • Redis 宕机或网络故障导致缓存不可用。

解决方案

  1. 设置过期时间随机化:避免缓存同时失效。
    expireTime := 60 + rand.Intn(30) // 随机增加30秒
    redis.Set("key", value, time.Duration(expireTime)*time.Second)
    
  2. 多级缓存架构:使用本地缓存(如 Guava Cache)+ 分布式缓存(Redis)。
  3. Redis 集群部署,避免单点故障。

总结

异常类型触发场景解决方案
缓存穿透请求的数据不存在缓存空值、布隆过滤器
缓存击穿热点数据过期的瞬间加锁、缓存预热
缓存雪崩大量缓存同时失效过期时间随机化、多级缓存

https://github.com/0voice

相关文章:

  • 【前缀和的力量:高效解决子数组和矩阵问题的秘笈】—— 蓝桥杯高频热点题型知识点
  • 向量数据库技术系列一-基本原理
  • rk3568 phy驱动调式_phy寄存器
  • Linux---用户组
  • 精选一百道备赛蓝桥杯——4.冶炼金属
  • SpringMVC-文件上传
  • 游戏引擎学习第163天
  • Codeforces Round 986 (Div. 2)
  • leetcode日记(99)不同的子序列
  • 感受命令行界面的魅力——Linux环境下基础开发工具的使用
  • Leetcode-132.Palindrome Partitioning II [C++][Java]
  • 如何在PyCharm中利用Python对象自动提示提高开发效率?
  • 数学建模 第二节
  • 删除二叉搜索树中的节点
  • 第五章-动态规划
  • 实践 PyTorch 手写数字识别
  • 机试准备第17天
  • Suno的对手Luno:AI音乐开发「上传参考音频 - 方式一:通过二进制流的方式」 —— 「Luno Api系列|AI音乐API」第11篇
  • 【NLP 38、实践 ⑩ NER 命名实体识别任务 Bert 实现】
  • Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实战指南
  • 2025上海十大动漫IP评选活动启动
  • 国际足联女子世界杯再次扩军,2031年起增至48支球队
  • 王受文已任全国工商联党组成员
  • 大风暴雨致湖南岳阳县6户房屋倒塌、100多户受损
  • 家庭相册㉙在沪打拼25年,我理解了父母清晨去卖蜜饯的辛苦
  • 吴清:加强监管的同时传递监管温度,尽力帮助受影响企业应对美加征关税的冲击