当前位置: 首页 > 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;经过多次尝试修改最终觉得单独修改控件色值比较好。 一、控件属性 //修改开关色值就是最…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...