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

news/2025/3/18 8:24:38/

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


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


http://www.ppmy.cn/news/1580020.html

相关文章

【eNSP实战】(续)一个AC多个VAP的实现—将隧道转发改成直接转发

在 一个AC多个VAP的实现—CAPWAP隧道转发 此篇文章配置的基础上,将隧道转发改成直接转发 一、改成直接转发需要改动的配置 (一)将连接AP的接口改成trunk口,并允许vlan100、101、102通过 [AC1]interface GigabitEthernet 0/0/8 …

《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(64)太极图化汉明距 - 汉明距离(位运算技巧)

《灵珠觉醒:从零到算法金仙的C++修炼》卷三天劫试炼(64)太极图化汉明距 - 汉明距离(位运算技巧) 哪吒在数据修仙界中继续他的修炼之旅。这一次,他来到了一片神秘的太极图谷,谷中有一幅巨大的太极图,图中蕴含着汉明距离的奥秘。谷口有一块巨大的石碑,上面刻着一行文字…

CoreData 调试警告:多个 NSEntityDescriptions 声明冲突的解决

概述 目前在苹果生态 App 的开发中,CoreData 数据库仍然是大部分中小应用的优先之选。不过,运行时 CoreData 常常产生各种“絮絮叨叨”的警告不禁让初学的秃头小码农们云里雾里。 这不,对于下面这一大段 CoreData 警告,大家是否一…

Kotlin 中 also 方法的用法和使用场景

Kotlin 中 also 方法的用法和使用场景 1. 作用 also 是 Kotlin 标准库中的一个范围函数,用于对对象执行操作并返回该对象本身。它的主要作用是: 提供一种简洁的方式对对象进行额外操作。返回值始终是调用 also 的对象本身。 语法: objec…

算法竞赛-基础算法-位运算

目录 1.快速幂 2.快速乘 3.lowbit(n) 4.其他 5.相关题目 6.小结 引言:位运算的主要特点之一是在二进制表示下不进位,一下为一些基础的位运算操作: 与或非异或and,&or,|not,~xor 1.快速幂 快速幂的计算原理就是基于位运算&#x…

uniapp-x 之useAttrs只读

数据类型: useAttrs在web端拿到的是obj,app拿到的是map 是否可以修改内部元素: 否,只读 这意味着你想这样写代码将会无效 let attrsuseAttrs();console.log("attrs",attrs, attrs instanceof Map)//appif(attrs ins…

MyBatis操纵数据库-XML实现(补充)

目录 一.多表查询二.MyBatis参数赋值(#{ }和${ })2.1 #{ }和${ }的使用2.2 #{ }和${ }的区别2.3 SQL注入2.3 ${ }的应用场景2.3.1 排序功能2.3.2 like查询 一.多表查询 多表查询的操作和单表查询基本相同,只需改变一下SQL语句,同时也要在实体类中创建出…

革新协作体验 | 集和诚KMDA-2631协作机器人控制器重磅上市!

随着制造业对柔性生产的需求激增,协作机器人正成为工业升级的核心力量。它们以安全、灵活、易用的特点,与人类并肩完成精密任务。而这一切的背后,离不开一颗强大的“大脑”——KMDA-2631协作机器人控制器,作为集和诚研发中心的全新…