当前位置: 首页 > news >正文

Redis中常见的缓存穿透、缓存击穿、缓存雪崩、缓存预热解决方案

文章目录

  • 一、缓存穿透
    • 1. 什么是缓存穿透
    • 2. 解决方案
      • 2.1 无效的key存放到Redis
      • 2.2 引入布隆过滤器
      • 2.3 如何选择:
  • 二、缓存击穿
      • 1. 什么是缓存击穿
      • 2. 解决方案
  • 三、缓存雪崩
    • 1. 什么是缓存雪崩
    • 2. 解决方案
      • 2.1 均匀过期
      • 2.2 热点数据缓存永远不过期
      • 2.3 采取限流降级的策略
  • 四、缓存预热
    • 1. 什么是缓存预热
    • 2. 解决方案
      • 2.1 工程启动时进行缓存的加载
      • 2.2 采用定时任务脚本来刷新缓存
      • 2.3 提前加载热点数据到缓存
      • 2.4 总结

一、缓存穿透

1. 什么是缓存穿透

缓存穿透是指用户请求的数据在缓存中不存在,同时在数据库中也不存在,导致用户每次请求该数据都要去数据库中查询一遍。如果有恶意攻击者不断请求系统中不存在的数据,会导致短时间内大量请求落在数据库上,造成数据库压力过大,甚至导致数据库承受不住而宕机崩溃。

缓存穿透的关键在于在Redis中查不到指定的key值,与缓存击穿的根本区别在于传入的key在Redis中确实不存在。如果黑客传入大量不存在的key,那么大量的请求将直接打到数据库上,这是非常危险的情况。因此,在日常开发中,我们需要对参数进行良好的校验,对于一些非法的参数或不可能存在的key,应直接返回错误提示。

如下图:
缓存穿透

2. 解决方案

2.1 无效的key存放到Redis

当Redis无法找到数据且数据库中也无法找到数据时,我们可以将该无效的key存放到Redis中,并将其值设置为"null",同时设置一个极短的过期时间。这样,在后续出现查询这个key的请求时,就可以直接返回null,而无需再查询数据库。然而,这种处理方式存在一个问题,即如果传入的不存在的key每次都是随机的,那么将其存放到Redis中就没有意义。

2.2 引入布隆过滤器

可以在使用缓存之前,引入布隆过滤器来判断某个key是否存在。布隆过滤器具有一定的误判率,但如果布隆过滤器判定某个key不存在,那么可以确定该key一定不存在;而如果判定某个key存在,则很大概率上是存在的(存在一定的误判率)。因此,我们可以将数据库中的所有key都存储在布隆过滤器中,然后在查询Redis之前,先通过布隆过滤器查询该key是否存在。如果布隆过滤器判定该key不存在,就可以直接返回,无需访问数据库,从而减轻了对底层存储系统的查询压力。这种方式可以有效地提高系统的性能和查询效率。

2.3 如何选择:

  • 针对一些恶意攻击,攻击带过来的大量key是随机,那么我们采用第一种方案就会缓存 大量不存在key的数据。那么这种方案就不合适了,我们可以先对使用布隆过滤器方案进行过滤掉 这些key。
  • 所以,针对这种key异常多、请求重复率比较低的数据,优先使用第二种方案直接过滤 掉。而对于空数据的key有限的,重复率比较高的,则可优先采用第一种方式进行缓存。

二、缓存击穿

1. 什么是缓存击穿

缓存击穿和缓存雪崩是两种类似的现象。缓存雪崩指的是在某一时刻,大规模的缓存失效,导致大量的请求直接访问数据库,从而引起数据库的压力剧增。而缓存击穿则是指某个热点的缓存失效,导致大量的并发请求集中到该缓存上,但由于缓存失效,这些请求无法从缓存中获取数据,只能直接访问数据库,进而导致数据库压力剧增。

2. 解决方案

热点key不设置过期时间

三、缓存雪崩

1. 什么是缓存雪崩

  • 如果在某一时刻,缓存中大量的key同时失效,那么会导致大量的请求直接访问数据库,从而给数据库带来巨大的压力。在高并发的情况下,这可能会导致数据库宕机的风险。如果运维人员立即重启数据库,很可能会再次引来新的请求流量,继续给数据库带来过大的压力。这种情况就被称为缓存雪崩。
  • 造成缓存雪崩的关键在于在同一时间大量的key失效。
  • 这种情况可能发生在两种情况下:一是Redis缓存宕机,导致所有的缓存都失效;二是缓存中的key设置了相同的过期时间,导致在同一时间大量的key同时过期失效。

2. 解决方案

2.1 均匀过期

可以采取均匀过期的策略,即设置不同的过期时间,让缓存失效的时间尽量均匀,避免相同的过期时间导致大规模缓存同时失效,进而造成大量数据库访问的情况。一种常见的做法是给每个key的失效时间添加一个随机值,这样可以确保缓存不会在同一时间大面积失效。

2.2 热点数据缓存永远不过期

为了防止热点数据缓存失效导致缓存雪崩,一种常见的做法是让热点数据的缓存永远不过期。这意味着,对于那些经常被访问的数据,我们可以设置它们的缓存过期时间为永久,使其始终保持在缓存中。通过这种方式,热点数据将始终可用,不会因为过期而导致大量的请求直接访问数据库,从而减轻数据库的压力。当然,为了避免缓存数据过期而导致数据不一致的问题,我们需要确保在更新数据时及时更新对应的缓存。这样一来,热点数据的缓存可以持续为系统提供快速响应,并有效地避免了因缓存失效而引发的缓存雪崩问题。

2.3 采取限流降级的策略

为了防止过多的请求对数据库造成压力过大导致系统崩溃,可以采取限流降级的策略。当系统的流量达到一定的阈值时,可以直接返回类似于“系统拥挤”等提示信息,以限制进一步的请求。通过这种方式,可以保证至少一部分用户能够正常使用系统,并且对于其他用户,即使需要多次刷新也能够最终获得结果。

四、缓存预热

1. 什么是缓存预热

  • 缓存预热是指系统上线后,提前将相关的缓存数据加载到缓存系统。避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题,用户直接查询事先被预热的缓存数据。
  • 如里不进行预热,那么Redis初始状态数据为空,系统上线初期,对于高并发的流量,都会访问到数据库 中,对数据库造成流量的压力。

2. 解决方案

2.1 工程启动时进行缓存的加载

2.2 采用定时任务脚本来刷新缓存

2.3 提前加载热点数据到缓存

2.4 总结

  1. 当数据量较小时,可以在工程启动时进行缓存的加载操作;
  2. 而当数据量较大时,可以采用定时任务脚本来刷新缓存;
  3. 而对于数据量过大的情况,可以优先保证热点数据提前加载到缓存中。

在启动过程中加载缓存可以减少对数据库的频繁访问,提高系统的并发处理能力。

定时任务脚本的使用可以定期刷新缓存,确保数据的及时更新。

而对于数据量过大的情况,提前加载热点数据到缓存中可以避免频繁的数据库查询,从而减轻数据库的压力。

通过合理的缓存策略和数据加载方式,可以优化系统的性能和稳定性。

相关文章:

Redis中常见的缓存穿透、缓存击穿、缓存雪崩、缓存预热解决方案

文章目录 一、缓存穿透1. 什么是缓存穿透2. 解决方案2.1 无效的key存放到Redis2.2 引入布隆过滤器2.3 如何选择: 二、缓存击穿1. 什么是缓存击穿2. 解决方案 三、缓存雪崩1. 什么是缓存雪崩2. 解决方案2.1 均匀过期2.2 热点数据缓存永远不过期2.3 采取限流降级的策略…...

第二章-自动驾驶卡车-自动驾驶卡车前装量产的要求

1、自动驾驶卡车的特点与挑战 重卡主要运行在相对封闭的高速公路,相较城市道路场景看似更简单。但是,由于重卡特有的物理特性、运行环境和商业运营要求,相较于乘用车的自动驾驶系统,重卡的自动驾驶系统对车辆的感知距离和精度、系…...

Midjourney API 申请及使用

Midjourney API 申请及使用 在人工智能绘图领域,想必大家听说过 Midjourney 的大名吧! Midjourney 以其出色的绘图能力在业界独树一帜。无需过多复杂的操作,只要简单输入绘图指令,这个神奇的工具就能在瞬间为我们呈现出对应的图…...

mysql mysql 容器 忽略大小写配置

首先能够连接上mysql,然后输入下面这个命令查看mysql是否忽略大小写 show global variables like %lower_case%; lower_case_table_names 0:不忽略大小写 lower_case_table_names 1:忽略大小写 mysql安装分为两种(根据自己的my…...

第58步 深度学习图像识别:Transformer可视化(Pytorch)

一、写在前面 (1)pytorch_grad_cam库 这一期补上基于基于Transformer框架可视化的教程和代码,使用的是pytorch_grad_cam库,以Bottleneck Transformer模型为例。 (2)算法分类 pytorch_grad_cam库中包含的…...

angular实现全局组件

之前我们实现全局组件的第一种方式。我们是在定义了组件的时候通过在declares:[component],然后exports出该组件。最后在页面中每次导入该组件,而这次我们将采用另一种方式来实现 1 新建公用组件: navbreadcrumbnavbreadcrumb.component.htmlnavbreadc…...

Spring编程模型(范式)

面向对象编程 契约接口:Aware aware:意识到的 契约接口(Aware)是Spring框架中的一个特性,它允许Bean对象意识到它们所在的环境并与之进行交互,用于提供特定的功能或信息给Bean对象。这些接口通常作为回调接口,在Bean初始化过程…...

Golang GORM 单表删除

删除只有一个操作,delete。也是先找到再去删除。 可以删除单条记录,也可以删除多条记录。 var s Studentdb.Debug().Delete(&s, "age ?", 100)fmt.Println(s)[15.878ms] [rows:1] DELETE FROM student WHERE age 100var s Studentdb.De…...

Windows 下 MySQL 源码学习环境搭建步骤【建议收藏】

【建议收藏】Windows 下如何安装最新版 MySQL 源码学习的调试环境步骤。 作者:芬达 《芬达的数据库学习笔记》公众号作者,开源爱好者,擅长 MySQL、ansible。 本文来源:原创投稿 爱可生开源社区出品,原创内容未经授权不…...

redis总复习

springboot基于redisson实现看门狗锁:Springboot基于Redisson实现Redis分布式可重入锁【案例到源码分析】_springboot redission lock_AP0906424的博客-CSDN博客 springboot基于redis实现设置缓存和过期时间的代码?包括key的设计 https://mbd.baidu.com/ug_share…...

[LeetCode - Python]844. 比较;含退格的字符串(Easy);415. 字符串相加(Easy)

1.题目 844. 比较含退格的字符串(Easy) 1.代码: class Solution:def backspaceCompare(self, s: str, t: str) -> bool:# 暴力法s list(s)t list(t)M 0N 0for i in range(len(s)):i -M if s[i] # :if i > 0 :s.pop(i)s.pop(i-…...

机器学习深度学习——NLP实战(自然语言推断——注意力机制实现)

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——NLP实战(自然语言推断——数据集) 📚订阅专栏:机器学习&…...

mac垃圾清理软件有哪些

随着使用时间的增加,mac系统会产生一些垃圾文件,影响系统的性能和稳定性。为了保持mac系统的高效,用户需要定期使用mac垃圾清理软件来清理系统缓存、日志、语言包等无用文件。CleanMyMac是一款功能强大的mac垃圾清理软件,它可以帮…...

8.18 校招 内推 面经

绿泡泡: neituijunsir 交流裙,内推/实习/校招汇总表格 1、校招 | 小米集团2024届全球校园招聘正式启动(内推) 校招 | 小米集团2024届全球校园招聘正式启动(内推) 2、2023校招总结--软件测试岗位 - 2 2…...

docker的web管理平台docker.ui

docker.ui安装 docker run --name docker.ui \ -p 8999:8999 \ --restartalways \ -v /var/run/docker.sock:/var/run/docker.sock \ -d joinsunsoft/docker.ui参数说明: docker run:启动container–name:容器命名–restartalways&#xff…...

20230822 Windows上使用find_package引入OpenCV报错

报错信息 打开Cmake项目时,find_package 报错: Found OpenCV Windows Pack but it has no binaries compatible with yourconfiguration.You should manually point CMake variable OpenCV_DIR to your build of OpenCVlibrary.原因 大概率原项目是在 …...

MySQL下载安装配置

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...

3D WEB轻量化引擎HOOPS产品助力NAPA打造船舶设计软件平台

NAPA(Naval Architectural PAckage,船舶建筑包),来自芬兰的船舶设计软件供应商,致力于提供世界领先的船舶设计、安全及运营的解决方案和数据分析服务。NAPA拥有超过30年的船舶设计经验,年营业额超过2560万欧…...

lesson9: C++多线程

1.线程库 1.1 thread类的简单介绍 C11 中引入了对 线程的支持 了&#xff0c;使得 C 在 并行编程时 不需要依赖第三方库 而且在原子操作中还引入了 原子类 的概念。要使用标准库中的线程&#xff0c;必须包含 < thread > 头文件 函数名 功能 thread() 构造一个线程对象…...

安卓修改SwitchCompat色值

SwitchCompat控件色值跟系统设置的主题有关&#xff0c;但是主题效果不是能轻易就能改的&#xff0c;因为涉及到整个APP的样式。网上方案基本都是通过修改style文件来改变色值&#xff0c;经过多次尝试修改最终觉得单独修改控件色值比较好。 一、控件属性 //修改开关色值就是最…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...