Redis缓存穿透、击穿、雪崩介绍以及解决方案

一、缓存穿透

1.1 什么是缓存穿透

指的是,外部进来的请求,查询一个不存在的数据。Redis中没有,数据库中也没有,这时候如果外部恶意大量请求,所有请求会直接查询数据库,导致数据库崩溃

1.2 解决方案

1.2.1 方案一:缓存空数据

缓存空数据到redis中,比如恶意请求查询编号为1的用户,我查询数据库后发现不存在,就直接在redis中添加键值对:{key: 1, value: null},这样外部再次大量请求也会直接请求在redis上,不会导致数据库异常

优点:简单

缺点:1、如果有大量的随机查询,比如查询编号为1,2,3,4,5......到一万亿的用户,我都保存一个键为编号,值为null的数据,那么对redis的内存压力也是很大的,保存了太多无用数据

2、如果编号为2的用户本来不存在,我现在在redis中设置了一个null的值;如果这个时候真的添加了这个编号为2的用户,那么外部查询也查询不到了:数据不一致

1.2.2 方案二:布隆过滤器

布隆过滤器是指,将键经过多次hash之后以0和1的数组格式,保存在一个位图(bitmap)中,一个请求进来,先把请求中查询的键去位图里查询,如果存在,再去查询Redis,如果不存在则连redis都不会去查,直接返回;

优点:位图bitmap占用内存较小,不像缓存空数据那样缓存大量的不需要的key

缺点:1、实现起来复杂,热点数据从数据库查询出来后,也要写入过滤器中

2、存在误判,如果一个不存在的数据,多次hash之后,在位图中的位置可能显示存在此条数据;导致查询数据库,但是总体上影响不大,误判率可自己在写代码时进行控制

二、缓存击穿

2.1 什么是缓存击穿?

当给某一个热点数据,设置了过期时间,当key过期时,恰好这段时间有大量的并发请求进来,那么可能会把数据库压垮

疑问:key过期了,Redis中查询不到,会去数据库查询,查询完成后不是又会写入redis中吗?为什么会导致大量请求到数据库呢?

解答:查询数据库并写入redis也是需要时间的,有些写入redis的结果集,是需要多表查询的结果,比如需要50ms的,甚至几秒钟才能从数据库查询出来的,那么这段时间就太长了

2.2 解决方案

2.2.1 互斥锁

当key过期后,后进来获取该key的第一个线程,在redis中查询不到,未命中;获取一个互斥锁,然后去查询数据库,获取结果后写入缓存,并释放锁;这段时间内,其他所有线程未命中redis中的数据,尝试获取锁失败(因为锁被线程1拿到了),导致获取锁的等待

优点:强一致性,数据一定是最新最正确的

缺点:要等到线程1查询到,写入redis中并释放锁之后,其他线程才能查询这条键值对的数据

2.2.2 逻辑过期

热点key不设值过期时间,而是加一个逻辑过期时间的字段,用来描述这整条数据是否逻辑过期;

当某个线程1拿到这条数据后,发现逻辑过期时间,已经过期,那么会新开一个线程2去进行缓存重建;而线程1不等待缓存重建的结果,直接将过期的数据返回回去

如果此时有更多的线程3来获取key发现过期,尝试获取锁失败后,会直接返回过期的数据,并不会开启新线程来进行缓存重建,因为只需要一个线程2进行缓存重建就可以了

当线程2缓存重建完成后,再之后的线程4就能获取到最新的数据了

优点:高可用(不管数据一致不一致,先返回了再说),性能优

缺点:不能保证数据绝对一致

三、缓存雪崩

3.1 什么是缓存雪崩?

是指同一时间大量的缓存key同时失效,或者Redis服务宕机,导致大量请求打到数据库,导致数据库压力巨大

3.2 解决方案

3.2.1 不同的过期时间

给不同的key设置不同的过期时间,可随机设置过期时间

3.2.2 Redis集群部署

利用Redis集群提高服务的高可用性,例如哨兵模式、集群模式等

3.2.3 降级限流策略

在redis之前添加降级限流策略,比如nginx、spring cloud gateway等,可以同时作为缓存穿透、击穿、雪崩的保底策略,不止是防范缓存雪崩

3.2.4 添加多级缓存

在redis之前,使用其他caffeine缓存等来做一级缓存,Redis作为二级缓存

附上《缓存三兄弟》及其解决方案打油诗一首:

穿透无中生有key,布隆过滤null隔离

缓存击穿过期key,锁与非期解难题

雪崩大量过期key,过期时间要随机

                                        --黑马程序员

注:其中的“锁与非期解难题”中的非期指的是逻辑过期

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025 持续防范 GitHub 投毒,通过 Sharp4SuoExplorer 分析 Visual Studio 隐藏文件

在2024年底的网络安全事件中,某提权工具被发现植入后门,攻击者利用 .suo 文件作为隐蔽的攻击方式。由于 .suo 文件是 Visual Studio 项目的隐藏配置文件,通常不为安全研究人员所关注,因此为攻击者提供了潜在的攻击渠道。 初步调查…

【Windows7和Windows10下从零搭建Qt+Leaflet开发环境】

Windows7和Windows10下从零搭建QtLeaflet开发环境 本文开始编写于2025年1月27日星期一(农历:腊月二十八,苦逼的人,过年了还在忙工作)。 第一章 概述 整个开发环境搭建需要的资源: 操作系统 Windows7_x6…

熵采样在分类任务中的应用

熵采样在分类任务中的应用 在机器学习的分类任务里,数据的标注成本常常制约着模型性能的提升。主动学习中的熵采样策略,为解决这一难题提供了新的思路。本文将带你深入了解熵采样在分类任务中的原理、应用及优势。 一、熵采样的原理(优化版) 熵,源于信息论,是对不确定…

WordPress自定义.js文件排序实现方法

在WordPress中,要将插件引用的.js文件放到所有.js文件之后加载,可以通过以下方法实现: 方法一:调整wp_enqueue_script的加载顺序 在插件的主文件中,使用wp_enqueue_script函数加载.js文件时,将$in_footer…

mysql 学习7 DCL语句,用来管理数据库用户,控制数据库的访问权限

DCL data control language 数据控制语言: 用来管理数据库用户,控制数据库的访问权限 有两个功能: 一,用户管理的SQL 语句,添加用户,删除用户,修改用户 查询用户 在mysql 中,用户…

8-登录流程

在AppStartInitFinish_CreateLoginUI.初始化后,执行Login界面的初始化 登录面板逻辑:UILoginComponentSystem,针对组件UILoginComponent创建的System 登录面板逻辑:UILoginComponent 逻辑层: LoginHelper中的clientSenderComponent.LoginA…

【远程控制】安装虚拟显示器

todesk远程发现没显示器的机器有问题 电脑如果不外接一个显示器那么会默认为1024 768 分辨率需要安装虚拟显示器参考 竟然是一个隐私屏幕的解决方案。 虚拟显示器 Parsec-vdd 项目地址 Parsec-vdd 最大的优点是:支持 4K 高刷、可添加多个虚拟屏、 H-Cursor&#…

【数据采集】基于Selenium采集豆瓣电影Top250的详细数据

基于Selenium采集豆瓣电影Top250的详细数据 Selenium官网:https://www.selenium.dev/blog/ 豆瓣电影Top250官网:https://movie.douban.com/top250 写在前面 实验目标:基于Selenium框架采集豆瓣电影Top250的详细数据。 电脑系统:Windows 使用软件:PyCharm、Navicat 技术需求…

安全实验作业

一 拓扑图 二 要求 1、R4为ISP,其上只能配置IP地址;R4与其他所有直连设备间均使用共有IP 2、R3-R5-R6-R7为MGRE环境,R3为中心站点; 3、整个OSPF环境IP基于172.16.0.0/16划分; 4、所有设备均可访问R4的环回&#x…

响应式编程_02基本概念:背压机制 Backpressure

文章目录 Pre流流的处理模型拉模式推模式 流量控制产者生产数据的速率小于消费者的场景生产者生产数据的速率大于消费者消费数据无界队列有界丢弃队列有界阻塞队列 背压机制响应式流规范响应式流的核心接口PublisherSubscriberSubscription 响应式流的技术生态圈 小结 Pre 响应…

Android 进程间通信

什么是IPC? Android 进程间通信(IPC,Inter-Process Communication)是Android操作系统中不同进程间交换数据和资源的一种机制。由于Android是多任务操作系统,每个应用通常运行在自己的进程中,以提高安全性和…

【人工智能】掌握图像风格迁移:使用Python实现艺术风格的自动化迁移

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 图像风格迁移(Image Style Transfer)是一种基于深度学习的计算机视觉技术,通过将一张图像的内容与另一张图像的艺术风格结合,生成一幅具…

Macos给brew安装的neo4j配置apoc插件

文章目录 打开并查看neo4j版本下载apoc插件安装apoc插件修改conf配置文件验证成果 打开并查看neo4j版本 open /usr/local/Cellar/neo4j下载apoc插件 apoc插件下载界面,选择与neo4j兼容的apoc版本apoc与neo4j版本对应表 安装apoc插件 将下载的apoc jar包&#…

回顾生化之父三上真司的游戏思想

1. 放养式野蛮成长路线,开创生存恐怖类型 三上进入capcom后,没有培训,没有师傅手把手的指导,而是每天摸索写策划书,老员工给出不行的评语后,扔掉旧的重写新的。 然后突然就成为游戏总监,进入开…

Go语言的转义字符

文章目录 1. Go语言的转义字符(escapechar)2. 小结和提示 1. Go语言的转义字符(escapechar) 说明:常用的转义字符有如下: \t : 表示一个制表符,通常使用它可以排版\n :换行符\\ :一个\\" :一个"\r :一个回…

Django框架丨从零开始的Django入门学习

Django 是一个用于构建 Web 应用程序的高级 Python Web 框架,Django是一个高度模块化的框架,使用 Django,只要很少的代码,Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容,并进一步开发出全功能…

《Kettle保姆级教学-核心概念解析》

目录 一、什么是ETL?1、ETL 的三个主要阶段2、ETL 的应用场景3、ETL 工具 二、什么是Kettle?1、Kettle 的核心功能2、Kettle 的主要组件3、Kettle 的优点4、Kettle 的应用场景 三、Kettle核心概念1. 转换(Transformation)2. 作业&…

DeepSeek:全栈开发者视角下的AI革命者

目录​​​​​​​ DeepSeek:全栈开发者视角下的AI革命者 写在前面 一、DeepSeek的诞生与定位 二、DeepSeek技术架构的颠覆性突破 1、解构算力霸权:从MoE架构到内存革命 2、多模态扩展的技术纵深 3、算法范式的升维重构 4、重构AI竞争规则 三、…

https是如何保证安全的,又是如何保证不被中间人攻击的?

HTTPS如何保证安全,以及如何防止中间人攻击 保护用户隐私和数据安全已经成为了一个不可忽视的问题。随着网络攻击的不断升级,HTTPS(超文本传输安全协议)成为了我们在网络上交流时的一道重要防线。以下是HTTPS是如何保证安全的&am…

Linux设备树(DTS)入门学习

前言: Linux设备树(DTS)入门学习,资料搜集。从零开始入门学习Linux设备树 Device Tree (DTS),建议的学习流程如下: 1. 讯为电子在哔站上的-Linux设备树视频教程(嵌入式学习之Linux驱动(第七期_设备树_全新…