Redis 的穿透、雪崩、击穿

Redis 的穿透、雪崩、击穿

1、缓存穿透

  • 定义

    • 缓存穿透是指查询一个不存在的数据,由于缓存中没有该数据,每次请求都会直接访问数据库,导致数据库压力过大
  • 产生原因

    • 恶意攻击:攻击者故意请求大量不存在的key,导致请求直接穿透到数据库中
    • 业务逻辑问题:用户查询的数据在数据库中也不存在(如查询不存在的商品ID)
    • 缓存未命中:缓存中存储相关数据,且数据库也没有,导致请求直接到达数据库
  • 解决方法

    1、布隆过滤器

    • 在缓存层前使用布隆过滤器,判断请求的key是否可能存在。如果布隆过滤器判断不存在,直接返回,减少对数据库的访问
    • 注意:布隆过滤器可能有误判(假阳性),但可以有效过滤大量无效请求

    2、缓存空值

    • 对于查询不存在的数据,将空值(如null)缓存到Redis中,并设置较短的过期时间(如30秒),避免重复穿透数据库

    3、参数校验

    • 在接口层对请求参数进行校验,过滤掉明显无效的请求(如负数ID、非法的查询参数)

    4、异步回填

    • 如果数据可能动态生成,可以异步触发数据生成逻辑,并缓存结果,防止频繁穿透

2、缓存雪崩

  • 定义
    • 缓存雪崩是指在某一个时刻,大量缓存key同时失效,或者Redis服务宕机,导致大量请求直接打到数据库,数据库无法承受高并发而崩溃
  • 产生原因
    • 缓存key集中失效:大量key设置了相同的过期时间,导致在同一时间点全部失效
    • Redis服务宕机:Redis集群不可用,所有请求直接访问数据库
    • 高并发场景:在缓存失效或不可用时,系统面临高并发请求,数据库不堪重负
  • 解决方法
    • 随机化过期时间
      • 在设置缓存过期时间时,添加随机偏移量(如在基础时间上加减几秒),避免大量key同时失效
    • 热点缓存时间延长
      • 对于热点数据,延长缓存时间,或设置为永不过期,定期异步更新
    • 高可用架构
      • 部署Redis集群(如主从复制、哨兵模式、Cluster模式),确保Redis服务高可用,防止单点故障
    • 降级与限流
      • 在数据库层实现限流机制(如通过Nginx或网关限制请求频率)
      • 提供降级方案,如返回默认值或提示用户稍后重试,减少数据库压力
    • 分布式锁
      • 在缓存失效时,使用分布式锁(如Redis锁或Zookeeper锁)限制同时访问数据库的线程数,防止数据库被压垮

3、缓存击穿

  • 定义

    • 缓存击穿是指某个热点key在失效的瞬间,大量并发请求同时访问该key,导致这些请求直接打到数据库上,造成数据库压力激增
  • 产生原因

    • 热点key失效:某个高频访问的key(如热门商品信息)在缓存中失效,且此时有大量并发请求
    • 高并发访问:热点数据失效后,大量线程同时查询数据库,导致数据库瞬间负载过高
  • 解决方法

    1、热点key永不过期

    • 对于热点数据,设置缓存永不过期,或通过异步任务定期刷新缓存内容

    2、分布式锁

    • 在缓存失效时,使用分布式锁(如redis的SEINX或Redisson)限制只有一个线程去查询数据库,其余线程等待缓存更新
    • 示例流程
      • 1、线程A发现缓存失效,尝试获取锁
      • 2、获取锁成功后,查询数据库并更新缓存
      • 3、其他线程等待锁释放后直接读取缓存

    3、异步加载

    • 在热点key接近失效时,提前异步触发缓存刷新,减少失效瞬间的请求压力

    4、热点隔离

    • 将热点数据单位存储到专用的Redis实例或本地缓存(如Caffeine、Guava Cache),降低对主数据库的冲击

总结对比

问题定义产生原因解决方法
缓存穿透查询不存在的数据,穿透到数据库恶意请求、数据不存在、缓存未命中布隆过滤器、缓存空值、参数校验
缓存雪崩大量 key 同时失效或服务宕机集中失效、Redis 宕机、高并发随机过期时间、高可用、限流降级
缓存击穿热点 key 失效,大量请求打到数据库热点 key 失效、高并发分布式锁、永不过期、异步刷新、热点隔离

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/475.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《map和set的使用介绍》

引言: 上次我们学习了第一个高阶数据结构—二叉搜索树,趁热打铁,今天我们就再来学习两个数据结构—map和set。 一:序列式容器和关联式容器 前面我们已经接触过STL中的部分容器如:string、vector、list、deque、arra…

C#学习日记

命名空间 知识点一 命名空间基本概念 概念 命名空间是用来组织和重用代码的 作用 就像是一个工具包,类就像是一件一件的工具,都是申明在命名空间中的 知识点二 命名空间的使用 基本语法 namespace 命名空间名 {类类 } namespace MyGame {class GameO…

OSI网络通信模型详解

OSI 模型就是把这整个过程拆解成了 7 个明确分工的步骤,每一层只负责自己那一摊事儿,这样整个系统才能顺畅运转,出了问题也容易找到“锅”在谁那。 核心比喻:寄快递 📦 想象你要把一份重要的礼物(你的数据…

高并发网络通信Netty之空轮询问题

一、问题背景 在 NioEventLoop 事件循环中,Selector 一次次 select() 返回为 0,且没有事件被触发,形成空转,导致 CPU 占用 100%,系统资源白白浪费。这种情况尤其在 高并发、连接数多、IO事件少 的场景下更容易出现。 …

Nginx+Tomcat负载均衡群集

一、NginxTomcat 负载均衡、动静分离 1、Tomcat 简介 名称由来:Tomcat 最初由 Sun 的软件构架师詹姆斯・邓肯・戴维森开发,后变为开源项目并由 Sun 贡献给 Apache 软件基金会。因 O’Reilly 开源项目常以动物命名相关书籍,他希望动物能自我照…

Linux下nginx访问路径页面

第一步:通过Xshell在虚拟机中下载nginx sudo apt-get install nginx 第二步:进入nginx配置页面 cd /etc/nginx 我这里创建了一个html文件夹 在进入去创建页面并且重新加载 boahuboahu-VMware-Virtual-Platform:/$ cd /etc/nginx boahuboahu-VMware-Vir…

python实战项目76:51job数据采集与分析

python实战项目76:51job数据采集与分析 一、数据采集二、数据预处理2.1 导入相关库、读取数据2.2 查看数据2.3 处理数据、删除重复值、删除空值2.4 处理薪资水平字段数据三、数据可视化3.1 不同公司规模招聘岗位数量分布3.2 不同公司性质招聘岗位数量分布3.3 不同年限要求招聘岗…

OPENGLPG第九版学习 - 纹理与帧缓存 part1

文章目录 6.1 纹理综述6.2 基木纹理类型6.3 创建并初始化纹理代理纹理 6.4 指定纹理数据6.4.1 显式设置纹理数据将静态数据载入到纹理对象 6.4.2 从缓存(目标对象GL_PIXEL_UNPACK_BUFFER)中加载纹理6.4.3 从文件加载图像(DDS为例)读取一个图像文件并返回内存中的纹素数据将纹素…

Redis 持久化机制详解:RDB、AOF 原理与面试最佳实践(AOF篇)

在上一章我们深入学习了 Redis 中重要的数据持久化机制 ——RDB(Redis Database),了解了其通过周期性快照将数据以二进制文件形式保存到磁盘的原理,包括触发条件、文件结构以及优缺点等核心内容。 Redis 持久化机制详解&#xff…

NumPy数组操作详解

在现代数据科学与工程计算领域,高效的数组操作是实现复杂算法的基础。NumPy作为Python的核心科学计算库,提供了一套强大的多维数组对象及操作机制。本文深入探讨NumPy数组的各种操作,旨在帮助读者全面掌握其功能与应用场景。 数组创建与属性查…

ER图:数据库设计的可视化语言 - 搞懂数据关系的基石

在数据库设计和数据建模领域,ER图(实体-关系图) 绝对是最基础、最核心的可视化工具之一。它用最直观的方式描绘了现实世界中的数据及其关系,是构建可靠数据库的蓝图。今天,我们就来聊聊这个技术基石。 本文来自「大千A…

图像特征检测算法ORB

ORB(Oriented FAST and Rotated BRIEF)是一种在计算机视觉领域广泛应用的特征检测与描述算法。 算法原理 特征点检测 :ORB 算法结合了 FAST(Features from Accelerated Segment Test)特征点检测方法和 Harris 特征点检…