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

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.mfbz.cn/a/470945.html

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

相关文章

幼犬狗粮和成年犬狗粮该怎么挑选?

亲爱的狗友们&#xff0c;我们都知道&#xff0c;给狗狗选择适合的狗粮是非常重要的。那么&#xff0c;面对市面上琳琅满目的幼犬狗粮和成年犬狗粮&#xff0c;我们该如何挑选呢&#xff1f;别担心&#xff0c;接下来就让我来给大家支支招。 &#x1f436; 幼犬狗粮挑选篇 &…

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

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

机器学习 - 训练模型

接着这一篇博客做进一步说明&#xff1a; 机器学习 - 选择模型 为了解决测试和预测之间的差距&#xff0c;可以通过更新 internal parameters, the weights set randomly use nn.Parameter() and bias set randomly use torch.randn(). Much of the time you won’t know what…

Unity 实现双屏或多屏内容展示

在某些应用场景&#xff0c;一个应用可能需要使用多个显示器显示。 Unity支持最多8个不同显示器同时显示应用程序中八个摄像头的视图&#xff0c;如下图&#xff1a; 具体实现如下&#xff1a; 1、在Hiearchy面板上点击鼠标右键->Camera,创建多一个Camera,如图&#xff1a…

postman 用上一个请求的响应体中的字段设置下一个请求的请求参数

文章目录 IntroPostman usagePre-request ScriptTests javascripts API Intro 这一切都是为了增加自动化动作所占的比例&#xff08;减少人手工操作复制粘贴可能会造成的错误&#xff09;。 Postman usage 最常用的&#xff1a;选HTTP方法类型、写URL&#xff0c;在Headers中…

EvaRichter勒索病毒来袭

目前勒索病毒仍然是全球最大的威胁&#xff0c;最近一年针对企业的勒索病毒攻击越来越多&#xff0c;大部分勒索病毒是无法解密的&#xff0c;并且不断有新型的勒索病毒出现&#xff0c;各企业一定要保持高度的重视&#xff0c;马上放假了&#xff0c;一款新型勒索病毒来袭....…

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

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

数据结构(三)复杂度的深层次剖析

之前发布了数据结构&#xff08;一&#xff09;&#xff0c;很多同学反响不够清晰&#xff0c;那今天就发一篇对复杂度专题的博客&#xff0c;希望对大家理解复杂度提供一些帮助。 时间复杂度 我们先来一个理解一个复杂度&#xff0c;二分查找的复杂度&#xff08;之前写过二…

app调用系统接口示意图

1.linux下app不能直接访问内核。 用户态和内核态 2. 系统调用是应用程序和系统内核之间的接口。 &#xff08;1&#xff09;app访问内核通过调用glibc中的系统调用接口&#xff08;open&#xff08;&#xff09;、read&#xff08;&#xff09;、write&#xff08;&#xff09;…

html5cssjs代码 024 响应式布局示例

html5&css&js代码 024 响应式布局示例 一、代码二、解释 该HTML代码重点在于构建一个带有响应式设计的两栏布局网页&#xff0c;包含页头、导航条、主要内容区&#xff08;左右两列&#xff09;和底部区域&#xff0c;并运用CSS样式设置页面元素的布局、颜色、字体、间…

C++特性三:多态---案例三(电脑组装)

案例描述&#xff1a; 电脑主要组成部件为 CPU&#xff08;用于计算&#xff09;&#xff0c;显卡&#xff08;用于显示&#xff09;&#xff0c;内存条&#xff08;用于存储&#xff09; 将每个零件封装出抽象基类&#xff0c;并且提供不同的厂商生产不同的零件&#xff0c;例…

PwnLab靶场PHP伪协议OSCP推荐代码审计命令劫持命令注入

下载链接&#xff1a;PwnLab: init ~ VulnHub 安装&#xff1a; 打开vxbox直接选择导入虚拟电脑即可 正文&#xff1a; 先用nmap扫描靶机ip nmap -sn 192.168.1.1/24 获取到靶机ip后&#xff0c;对靶机的端口进行扫描&#xff0c;并把结果输出到PwnLab文件夹下&#xff0c;命名…

杰发科技AC7801——Keil编译的Hex大小如何计算

编译结果是Keil里面前三个数据的总和&#xff1a; 即CodeRoDataRWData的总和。 通过ATCLinkTool工具查看内存&#xff0c;发现最后一个字节正好是5328 注意读内存数据时候需要强转成32位&#xff0c;加1000的 增加1024的地址只需要加256即可

【技术栈】Redis 删除策略

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;学习技术栈 个性签名&#xff1a;保留赤子之心也许是种幸运吧 本文封面由 凯楠&#x1f4f8; 友情提供 目录 相关传送门 前言 1. 删除策略的目标 2. 数据删除策略 2.1 定时删除 2.2 惰性删除 2.3 定期删除…

【S5PV210】 | GPIO编程

【S5PV210】 | GPIO编程 时间:2024年3月17日22:02:32 目录 文章目录 【`S5PV210`】 | `GPIO`编程目录1.参考2.`DataSheet`2.1.概述2.1.1.特色2.1.2 输入/输出配置2.1.3 `S5PV210` 输入/输出类型2.1.4 IO驱动强度**2.1.4.1 类型A IO驱动强度****2.1.4.2 类型A IO驱动强度****2…

Windows电源管理调节-Powercfg命令应用

Windows电源管理调节 PowerCfg命令介绍 在Windows下我们使用 powercfg.exe命令 来控制电源计划(也称为电源方案),以使用可用的睡眠状态、控制单个设备的电源状态,以及分析系统中常见的能效和电池寿命问题。 语法 Powercfg 命令行使用以下语法: powercfg /option [arg…

使用WordPress在US Domain Center上建立多语言网站的详细教程

第一部分&#xff1a;介绍多语言网站 多语言网站是一种可以用多种语言呈现内容的网站。它能够满足不同国家或地区用户的语言需求&#xff0c;提升网站的用户体验和可访问性。在WordPress中&#xff0c;您可以轻松地创建一个多语言网站&#xff0c;并通过插件来管理多语言内容&…

Go 1.22 - 更加强大的 Go 执行跟踪

原文&#xff1a;Michael Knyszek - 2024.03.14 runtime/trace 包含了一款强大的工具&#xff0c;用于理解和排查 Go 程序。这个功能可以生成一段时间内每个 goroutine 的执行追踪。然后&#xff0c;你可以使用 go tool trace 命令&#xff08;或者优秀的开源工具 gotraceui&a…

漏洞发现-漏扫项目篇Poc开发Yaml语法插件一键生成匹配结果交互提取

知识点 1、Nuclei-Poc开发-环境配置&编写流程 2、Nuclei-Poc开发-Yaml语法&匹配提取 3、Nuclei-Poc开发-BurpSuite一键生成插件 章节点&#xff1a; 漏洞发现-Web&框架组件&中间件&APP&小程序&系统 扫描项目-综合漏扫&特征漏扫&被动漏扫…

C语言经典算法-8

文章目录 其他经典例题跳转链接41.基数排序法42.循序搜寻法&#xff08;使用卫兵&#xff09;43.二分搜寻法&#xff08;搜寻原则的代表&#xff09;44.插补搜寻法45.费氏搜寻法 其他经典例题跳转链接 C语言经典算法-1 1.汉若塔 2. 费式数列 3. 巴斯卡三角形 4. 三色棋 5. 老鼠…
最新文章