Redis中的缓存穿透、雪崩、击穿(详细)

news2024/11/18 23:31:19

目录

一、概念

1. 缓存穿透(Cache Penetration)

解决方案:

2. 缓存雪崩(Cache Avalanche)

解决方案:

3. 缓存击穿(Cache Breakdown)

 解决方案:

二、三者出现的根本原因

1. 缓存穿透(Cache Penetration)

2. 缓存雪崩(Cache Avalanche)

3. 缓存击穿(Cache Breakdown)

 


一、概念

在Redis中,缓存穿透、缓存雪崩和缓存击穿是与缓存相关的三个常见问题,它们都可能对系统性能和可用性产生负面影响。以下是它们在Redis中的概念:

1. 缓存穿透(Cache Penetration)

概念: 缓存穿透是指查询一个不存在于缓存中的数据,导致每次请求都直接访问底层存储系统,而不会被缓存。这可能是由于查询的数据根本不存在,或者是由于恶意攻击而导致大量查询。

解决方案:

  • 使用布隆过滤器(Bloom Filter)来快速判断一个数据是否存在于缓存中。
  • 使用空值缓存,即使查询结果为空,也能减轻对底层存储系统的频繁查询。
解决方案:
  • 使用布隆过滤器(Bloom Filter)来快速判断一个数据是否存在于缓存中。
  • 使用空值缓存,即使查询结果为空,也能减轻对底层存储系统的频繁查询。

 

2. 缓存雪崩(Cache Avalanche)

概念: 缓存雪崩是指缓存中的大量数据同时失效或者同时被删除,导致大量请求直接访问底层存储系统,造成系统压力增大,甚至崩溃。

解决方案:
  • 随机化缓存数据的过期时间,避免大量数据同时失效。
  • 使用多级缓存结构,其中一级缓存失效时,可以从下一级缓存获取数据。
  • 缓存预热,在系统启动或低峰期,预先加载热门数据到缓存中。

3. 缓存击穿(Cache Breakdown)

概念: 缓存击穿是指一个热门的缓存键突然失效,导致大量请求直接访问底层存储系统,造成系统压力增大。与缓存雪崩不同的是,缓存击穿通常是某个特定的缓存键失效。

 解决方案:
  • 使用互斥锁或分布式锁,确保只有一个请求能够重新生成缓存数据,其他请求等待。
  • 在缓存失效时,通过异步方式重新生成缓存,避免大量请求同时访问底层存储系统。

这些问题在设计和使用Redis缓存时需要特别注意,采取适当的解决方案可以有效地提高系统的稳定性和性能。

 

二、三者出现的根本原因

缓存穿透、缓存雪崩和缓存击穿这三个问题的出现都与缓存系统的设计和使用方式有关,它们分别由不同的原因引起。

1. 缓存穿透(Cache Penetration)

根本原因: 缓存穿透的根本原因是查询的数据不存在于缓存中,但仍然被频繁查询,导致每次请求都直接访问底层存储系统。这可能是由于查询的数据根本不存在,或者是由于查询的数据无效。

导致因素:

  • 恶意攻击或非法请求,查询不存在的数据。
  • 查询的数据在缓存中没有被预先加载,而且也不存在于底层存储系统中。

解决方案:

  • 使用布隆过滤器来快速判断一个数据是否存在于缓存中。
  • 使用空值缓存,即使查询结果为空,也能减轻对底层存储系统的频繁查询。

2. 缓存雪崩(Cache Avalanche)

根本原因: 缓存雪崩的根本原因是缓存中的大量数据同时失效或者同时被删除,导致大量请求直接访问底层存储系统。

导致因素:

  • 缓存数据的过期时间设置不合理,导致大量数据在同一时间失效。
  • 缓存服务器宕机或重启。

解决方案:

  • 随机化缓存数据的过期时间,避免大量数据同时失效。
  • 使用多级缓存结构,其中一级缓存失效时,可以从下一级缓存获取数据。
  • 缓存预热,在系统启动或低峰期,预先加载热门数据到缓存中。

3. 缓存击穿(Cache Breakdown)

根本原因: 缓存击穿的根本原因是一个热门的缓存键突然失效,导致大量请求直接访问底层存储系统。

导致因素:

  • 特定缓存键的数据失效,导致大量请求同时访问底层存储系统。

解决方案:

  • 使用互斥锁或分布式锁,确保只有一个请求能够重新生成缓存数据,其他请求等待。
  • 在缓存失效时,通过异步方式重新生成缓存,避免大量请求同时访问底层存储系统。

 

 

 

 

 

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

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

相关文章

elasticsearch操作

目录 一、mapping映射属性二、索引库的CRUD2.1 创建索引库和映射2.2 查询索引库2.3 修改索引库2.4 删除索引库2.5 总结 三、文档操作3.1 新增文档3.2 查询文档3.3 删除文档3.4 修改文档3.5 总结 四、RestClient操作索引库4.1 初始化RestClient4.2 创建索引库4.3 删除索引库4.4 …

MySQL数据库的安装

MySQL官网:https://www.mysql.com/ 进入下载页面:https://www.mysql.com/downloads/ 选择社区版: 选择MySQL Community Server: 根据自己的需要选择版本。例如选择8.2.0版本: 例如选择Windows (x86, 64-bit), M…

使用Python爬取快手视频与评论(App与Web端分析)

文章目录 1. APP端抓包配置2. APP端抓包分析3. Web端抓包分析4. 爬虫代码实现 【作者主页】:吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作! 【作者推荐】&#xff1a…

Go 从编译到执行

一、Go运行编译简介 Go语言(也称为Golang)自从2009年由Google发布以来,已成为现代软件开发中不可或缺的一部分。设计者Rob Pike, Ken Thompson和Robert Griesemer致力于解决多核处理器、网络系统和大型代码库所引发的现实世界编程问题。我们…

LeetCode刷题---斐波那契数列模型

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、第N个泰波那契数 题目链接:1137. 第 N 个泰波那契数 题目描述 泰波那契序列Tn定义如下: T00,T11,T2 1,且在n&g…

【SpringCloud原理】OpenFeign原来是这么基于Ribbon来实现负载均衡的

大家好,本文我将继续来剖析SpringCloud中负载均衡组件Ribbon的源码。本来我是打算接着OpenFeign动态代理生成文章直接讲Feign是如何整合Ribbon的,但是文章写了一半发现,如果不把Ribbon好好讲清楚,那么有些Ribbon的细节理解起来就很…

Pycharm2020.3.5激活方式

激活插件链接:https://pan.baidu.com/s/1tPd7V4pKUx0Z6fSKumLjTQ 提取码:lr12 1.pycharm主界面点开设置如下: 2.点击 Plugins 然后依次点击:小齿轮->选择本地安装(下图) 3.找到存放插件的目录&#xf…

系统设计概念:生产 Web 应用的架构

在你使用的每个完美应用程序背后,都有一整套的架构、测试、监控和安全措施。今天,让我们来看看一个生产就绪应用程序的非常高层次的架构。 CI/CD 管道 我们的第一个关键领域是持续集成和持续部署——CI/CD 管道。 这确保我们的代码从存储库经过一系列测试…

用customize-cra+react-app-rewired配置less+css module

1. 安装 npm i less less-loader -D npm i customize-cra-less-loader -D2.添加配置项 //config-overrides.js const { override } require(customize-cra); const addLessLoader require("customize-cra-less-loader");module.exports {webpack: override(addL…

解决VS2019无法正常显示XAML设计界面问题

问题描述 当VS2019配置工程为x64模式时,打开工程中XAML页面可能出现如下错误提示,进而无法正常显示XAML设计界面。 There was an exception when loading the design time assembly C:\Users\Administrator\AppData\Local\Microsoft\VisualStudio\16.0_…

【云备份】热点管理模块

文章目录 整体思路概括热点管理实现构造函数Hotjudge ——热点判断RunModule ——运行模块 代码实现hot.hpp 整体思路概括 整体概括: 对服务器上备份的文件进行检测,那些文件长时间没有被访问,则认为是非热点文件 进行压缩存储,节…

基于UDP的网络聊天室

客户端 #include <myhead.h> //定义存储信息结构体 typedef struct _MSG {char code; //操作码&#xff1a;L表示登录C表示群聊S表示系统消息S表示退出char name[128]; char txt[256];}msg_t;//定义保存客户端网络信息的链表 typedef struct _ADDR {struct sockaddr_i…

【Springboot系列】SpringBoot整合Jpa

文章目录 前言&#xff1a;什么是JPA&#xff1f;JPA优缺点优点1.简化开发&#xff1a;2.高度抽象&#xff1a;3.跨数据库支持&#xff1a;4.自动化的事务管理&#xff1a; 缺点1.学习成本较高&#xff1a;2.性能问题&#xff1a;3.灵活性受限&#xff1a; 示例版本依赖代码Use…

VSCode 代码调试

断点调试&#xff08;debug&#xff09;&#xff1a; 指在程序的某一行设置一个断点&#xff0c;调试时&#xff0c;程序运行到这一行就会停住&#xff0c;然后你可以一步一步往下调试&#xff0c;调试过程中可以看各个变量当前的值&#xff0c;出错的话&#xff0c;调试到出错…

NSSCTF第14页(1)

[suctf 2019]checkin 利用了几种方式&#xff0c;发现都不行 1是修改mime类型&#xff0c;2是修改php标签为js标签&#xff0c;3是修改文件后缀 在试试用配置文件来上传 发现上传.user.ini文件成功 发现上传成功 上传的png图片 访问上传路径发现可以访问&#xff0c;上马成…

位运算算法【2】

文章目录 &#x1f377;371. 两整数之和&#x1f959;题目&#x1f345;算法原理&#x1f346;代码实现 &#x1f378;137. 只出现一次的数字 II&#x1f9c6;题目&#x1fad2;算法原理&#x1f954;代码实现 &#x1f379;面试题 17.19. 消失的两个数字&#x1f95a;题目&…

Android : GPS定位 获取当前位置—简单应用

示例图&#xff1a; MainActivity.java package com.example.mygpsapp;import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat;import android.Manif…

burp2023专业版,配置上游代理太难找

burpsuite2023专业版的工具栏与之前的版本不同的是&#xff0c;工具栏中没有了user options这一选项 但在通常的使用过程中&#xff0c;常用到配置上游代理。之前的版本呢&#xff0c;上游代理的配置都在user options选项中设置&#xff0c;user options选项还在工具栏中&#…

小航助学题库蓝桥杯题库c++选拔赛(23年8月)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09; 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;

【JS Promise, Promise.all 与 async/await用法详解】

目录 PromisePromise基本使用Promise可进行连续回调Promise回调可接受入参1.工作原理 async/await总结参考文档&#xff1a; 异步 let a 0setTimeout(() > {a 1}, 1000)console.log(a) // 0此时这个延迟就成为异步执行的了&#xff0c;a值还没有变1就被使用输出&#xff0…