Redis之缓存穿透、缓存雪崩、缓存击穿

news2024/11/27 20:36:03

Redis之缓存穿透、缓存雪崩、缓存击穿

什么是缓存穿透?

在这里插入图片描述

如果有人故意将请求打到未缓存的数据上,会对数据库造成巨大的压力

如何解决?
  1. 做好参数校验,比如请求的id不能<0,在访问数据库前就把这些异常访问拦截了

  2. 缓存一些无效key,假如访问的key既不再Redis中也不在数据库中,那么就把当前这个key缓存在Redis中,这种方式可以防止恶意请求使用同一个key进行缓存穿透。但是这种方法不能从根本上解决问题。人也不傻,一看,哎呀第一次访问这么慢(假设500ms),后面怎么变快了(100ms),看来要变化一下请求参数了😈

  3. 布隆过滤器,通过它我们可以非常方便地判断一个给定数据是否存在于海量数据中。我们可以把它看作由二进制向量(或者说位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构。相比于我们平时常用的 List、Map、Set 等数据结构,它占用空间更少并且效率更高,但是缺点是其返回的结果是概率性的,而不是非常准确的。理论情况下添加到集合中的元素越多,误报的可能性就越大。并且,存放在布隆过滤器的数据不容易删除

布隆过滤器的原理如下

img

  1. 位数组:布隆过滤器使用一个位数组作为基本的存储结构,初始时所有位都被设置为0。
  2. 多个哈希函数:布隆过滤器使用多个哈希函数,每个哈希函数可以将输入元素映射到位数组中的多个位置。这些哈希函数通常是独立且均匀分布的,可以确保元素被哈希到位数组的不同位置。
  3. 插入操作:当一个元素被插入到布隆过滤器中时,该元素经过多个哈希函数得到对应的多个哈希值,然后将位数组中对应位置的值设置为1。
  4. 查询操作:当查询一个元素是否存在于布隆过滤器中时,将该元素经过多个哈希函数得到对应的多个哈希值,然后检查位数组中对应位置的值是否都为1。如果所有位置都为1,则判断该元素可能存在于布隆过滤器中;如果有任何一个位置为0,则可以确定该元素一定不存在于布隆过滤器中。

布隆过滤器的优点是插入和查询操作的时间复杂度都是常数级别的,具有很高的查询速度和空间效率。但是由于哈希冲突的存在和误判率的问题,布隆过滤器可能会出现误判,即判断某个元素存在于布隆过滤器中,但实际上该元素并没有被插入。因此,在使用布隆过滤器时,需要根据具体情况来权衡误判率和空间需求,以及对查询性能的要求。

关于更多的详细介绍可以看:五分钟搞懂布隆过滤器

使用布隆过滤器解决缓存穿透的流程
  1. 将所有可能存在的请求的值都存放在布隆过滤器中,当用户请求过来时,只需要判断,布隆过滤器中是否存在请求的数据(比如数据的id)
  2. 如果不存在,可以认为这是一个恶意请求,直接返回空,不走数据库;
  3. 如果存在就正常走缓存和数据库
缓存雪崩

缓存雪崩是指在同一时间内大量的缓存key同时失效或者Redis服务器宕机,导致大量的请求到达数据库,带来巨大压力

img

解决方案

避免大量的缓存key同时失效

  1. 可以给缓存随机的失效时间,避免同一时间大量的Key同时失效
  2. 缓存预热,将一些热点数据提前加载到Redis中
缓存预热的实现方式
  1. 定时任务,比如基于Spring的定时任务
/**
 * 每5分钟加载1次热点数据
 */
@Scheduled(fixedRate = 5 * 60 * 1000)
public void loadHotData() {
    // 查询数据库...
    // 将热点数据缓存在Redis中
}
  1. 使用消息队列,比如RabbitMQ异步进行缓存预热,将数据库中的热点数据的主键发送到消息队列中,然后由缓存消费队列中的数据,根据消息主键查询数据库并更新缓存
避免Redis服务器宕机
  1. 限流,避免流量压垮Redis
  2. 多级缓存,可以使用本地缓存+Redis缓存的模式,先查询本地缓存,如果命中就直接返回,无需访问Redis,减轻Redis压力
  3. 采用Redis集群,例如主从架构,主节点宕机了,从节点可以顶上
缓存击穿

在这里插入图片描述

缓存击穿中,请求的 key 对应的是 热点数据 ,该数据 存在于数据库中,但不存在于缓存中(通常是因为缓存中的那份数据已经过期) 。这就可能会导致瞬时大量的请求直接打到了数据库上,对数据库造成了巨大的压力,可能直接就被这么多请求弄宕机了。

解决方案
  1. 互斥锁方案,同一时间下只能有一个线程更新缓存,未能获取互斥锁的请求,要么等待锁释放后重新读取缓存,要么就返回空值或者默认值;

优点:可以保证一致性,实现简单,没有额外的内存消耗

缺点:线程需要等待,性能受影响

  1. 热点数据不设置过期时间,由后台异步更新缓存,或者在热点数据要过期前,提前通知后台线程更新缓存以及重新设置过期时间

优点:不设置过期时间可以确保热点数据不会因为过期而被清除,从而降低了缓存失效的频率,减少了缓存击穿的可能性,同时使用异步更新保证数据的一致性

缺点:实现复杂度增加、内存消耗增加

总结

缓存击穿:大量的请求访问不存在的数据,导致数据库的压力上升

缓存雪崩:大量的缓存数据同一时间失效,导致数据库的压力上升

缓存击穿:高并发下,一个热点的数据缓存过期了,所有的并发请求同时打到数据库,导致数据库的压力上升

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

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

相关文章

nginx搭建及部署

目录 一、nginx是什么&#xff1f; 二、安装部署 1.下载 2.配置 3.代理Swagger服务 4.nginx命令 一、nginx是什么&#xff1f; 是用于 Web 服务、反向代理、内容缓存、负载均衡、媒体流传输等场景的开源软件。它最初是一款专为实现最高性能和稳定性而设计的 Web 服务器。…

使用 CSS 实现毛玻璃效果

在现代 Web 设计中,毛玻璃效果越来越受欢迎。它能够让界面元素看起来更加柔和、朦胧,同时又不会完全遮挡背景内容,给人一种透明而又不失质感的视觉体验。虽然过去实现这种效果需要借助图像编辑软件,但现在只需要几行 CSS 代码,就可以在网页上呈现出令人惊艳的毛玻璃效果。 使用…

Data-Free Generalized Zero-Shot Learning 中文版

摘要 深度学习模型具有从大规模数据集中提取丰富知识的能力。然而&#xff0c;由于涉及到数据版权和隐私问题&#xff0c;数据共享变得越来越具有挑战性。因此&#xff0c;这妨碍了从现有数据向新的下游任务和概念有效转移知识。零样本学习&#xff08;ZSL&#xff09;方法旨在…

MNN Session 创建执行器(六)

系列文章目录 MNN createFromBuffer&#xff08;一&#xff09; MNN createRuntime&#xff08;二&#xff09; MNN createSession 之 Schedule&#xff08;三&#xff09; MNN createSession 之创建流水线后端&#xff08;四&#xff09; MNN Session::resize 之流水线编码&am…

element-ui出的treeselect下拉树组件基本使用,以及只能选择叶子节点的功能,给节点添加按钮操作

element-ui出的treeselect下拉树组件基本使用&#xff1a;Vue通用下拉树组件riophae/vue-treeselect的使用-CSDN博客 vue-treeselect 问题合集、好用的树形下拉组件&#xff08;vue-treeselect的使用、相关问题解决方案&#xff09;-CSDN博客 需求1&#xff1a;treeselect下拉…

数据结构和算法模块——队列(多例子+图文)

一文帮你看懂队列 什么是线性表为什么要学习线性表&#xff0c;它有什么用处和好处&#xff1f;基本概念分类存储结构结构特点 队列为什么要学习队列&#xff1f;基本概念数据结构基本操作 待填坑 什么是线性表 为什么要学习线性表&#xff0c;它有什么用处和好处&#xff1f;…

【测试开发学习流程】MySQL函数运算(中)(下)

前言&#xff1a; 这些天还要搞毕业论文&#xff0c;东西少了点&#xff0c;大家将就看看QWQ 目录 1 MySQL的数据处理函数 1.1 文本处理函数 1.2 日期与时间函数 1.3 数值处理函数 1.4 系统函数 2 聚集运算 2.1 聚集函数 2.2 流程函数 1 MySQL的数据处理函数 MySQL支…

云手机在海外电商中的应用优势

随着海外市场的不断拓展&#xff0c;电商行业对于高效、安全的工具需求日益增长。在这一背景下&#xff0c;云手机作为一种新型服务&#xff0c;为海外电商提供了强大的支持和便利。云手机对传统物理手机起到了非常好的延展和补充作用&#xff0c;拓展了更广泛的应用场景&#…

windows管理github代码

资料 windows SSH下载github

【数字IC/FPGA】书籍推荐(0)----《Verilog 传奇--从电路出发的HDL代码设计》

在下这几年关于数字电路、Verilog、FPGA和IC方面的书前前后后都读了不少&#xff0c;发现了不少好书&#xff0c;也在一些废话书上浪费过时间。接下来会写一系列文章&#xff0c;把一部分读过的书做个测评&#xff0c;根据个人标准按十分制满分来打分并分享给大家。 定位 书名…

游戏反云手机检测方案

游戏风险环境&#xff0c;是指独立于原有设备或破坏设备原有系统的环境。常见的游戏风险环境有&#xff1a;云手机、虚拟机、虚拟框架、iOS越狱、安卓设备root等。 这类风险环境可以为游戏外挂、破解提供所需的高级别设备权限&#xff0c;当游戏处于这些风险环境下&#xff0c…

<深度学习初识>——《深度学习笔记》

深度学习笔记 一、人工智能简介 1.人工智能发展的重要时间节点 1.1人工智能孕育期 1.2人工智能诞生期 1.3人工智能第一次浪潮的发展 1.4人工智能的第一次寒冬 第一次寒冬主要面临的几个问题&#xff1a; 1.5人工智能第二次浪潮的发展 1.6人工智能的第二次寒冬 1.7人工智能第…

FREERTOS队列集和事件标志组

队列集 一个队列只允许任务间传递的消息为同一种数据类型&#xff0c;如果需要在任务间传递不同数据类型的消息时&#xff0c;那么就可以使用队列集&#xff01; 作用&#xff1a;用于对多个队列或信号量&#xff08;信号量本质上也是个队列&#xff09;进行“监听”&#xff…

python(Django)之登录功能实现

1、创建登陆函数 def login(request):if request.POST:username password username request.POST.get(username)password request.POST.get(password)user auth.authenticate(usernameusername, passwordpassword)if user is not None and user.is_active:auth.login(req…

医药工厂5G智能制造数字孪生可视化平台,推进医药企业数字化转型

医药工厂5G智能制造数字孪生可视化平台&#xff0c;推进医药企业数字化转型。随着科技的不断发展&#xff0c;数字化转型已成为医药企业不可或缺的一部分。5G智能制造医药工厂数字孪生可视化平台作为数字化转型的重要工具&#xff0c;正在逐步改变医药企业的生产方式和管理模式…

MATLAB:函数与数值积分

一、数学函数图像的绘制 clc,clear fh (x)2*exp(-x).*sin(x); Xrange [0,8]; gx (x)3*exp(-x)*0.8.*sin(x); fplot(fh,Xrange,r-*,LineWidth,1.5) hold on grid on fplot(gx,Xrange,b-o,LineWidth,1.5) axis([-0.5,8.5,-0.1,0.85]) legend(fh (x)2*exp(-x).*sin(x),gx (x…

QB PHP 多语言配置

1&#xff1a; 下载QBfast .exe 的文件 2&#xff1a; 安装的时候 &#xff0c;一定点击 仅为我 安装 而不是 所有人 3&#xff1a; 如果提示 更新就 更新 &#xff0c; 安装如2 4&#xff1a; 如果遇到 新增 或者编辑已经 配置的项目时 不起作用 &#xff1a; 右…

【Linux】编译器-gcc/g++的使用(预处理、编译、汇编、连接)

目录 01.预处理&#xff08;宏替换&#xff09; 02.编译&#xff08;生成汇编&#xff09; 03.汇编&#xff08;生成机器可识别码&#xff09; 04.连接&#xff08;生成可执行文件或库文件&#xff09; 05.选项 编译器在编译代码时包含以下四个步骤&#xff1a;1.预处理 2…

读算法的陷阱:超级平台、算法垄断与场景欺骗笔记15_虚拟助手

1. 虚拟助手 1.1. 站在全球视角&#xff0c;这些公司是&#xff1a;亚马逊、脸书、谷歌和苹果 1.1.1. 苹果的Siri 1.1.2. 亚马逊的Alexa 1.1.3. 脸书Messenger应用上的M 1.1.4. 谷歌语音助手Assistant 1.2. 借由人工智能技术&#xff0c;虚拟助手将对用户的个人电子档案、…

机器学习 - 选择模型

接着这一篇博客做进一步说明&#xff1a; 机器学习 - 准备数据 PyTorch moduleExplaintorch.nnContains all of the building blocks for computational graphs (essentially a series of computations executed in a particular way). nn 模块为用户提供了丰富的神经网络组件…