Redis 面试题——缓存穿透、缓存击穿和缓存雪崩

目录

  • 1.缓存穿透
  • 2.缓存击穿
  • 3.缓存雪崩
  • 4.总结

参考文章:
缓存实战(1)缓存雪崩、缓存击穿和缓存穿透入门简介及解决方案

1.缓存穿透

(1)问题描述:缓存穿透是指在高并发场景下,大量的请求访问一个不存在于缓存中也不存在于数据库中的数据,导致每次请求都要查询数据库,增加了数据库的负载。通常发生在恶意攻击、频繁访问不存在的数据或缓存设置不当等情况下。例如查询为 id 为 “-1” 的记录,这时的用户很可能是攻击者,该攻击会导致数据库压力过大。

在这里插入图片描述

(2)解决方案

  • 请求校验:有些请求具有一定的规则,因此我们响应这个请求之前可以按照一定的规则进行校验,例如已经明确要查询的课程 id 在某一范围内,那么我们可以对其进行校验。不过该方法具有一定的局限性,例如有些请求的规律不太明显,不太适合进行校验。
  • 缓存空值或特殊值:如果一个查询返回的数据为 null(不管是数据是否不存在),我们仍然把这个空结果 (null) 或设置的特殊值进行缓存,但是要注意,如果缓存了空值或特殊值,一定要设置一个短暂的过期时间

思考:为什么一定要设置一个短暂的过期时间?
回答:例如,我们目前要查询课程 id 为 128 的课程,但该课程目前不存在,因此我们可以将特殊值 <“course:128”, “null”> 存储到 redis 中,如果 <“course:128”, “null”> 这条数据在 redis 中长期存在,并且未来我们增加一门课程 id 为 128 的课,那么在查询这门课时,我们会从缓存中得到 “null” 的结果,但是显然数据库中是存在该课程的数据的。因此为了避免这种缓存数据与数据库数据不一致的情况,我们需要将空值或特殊值设置一个短暂的过期时间

  • 使用布隆过滤器:布隆过滤器是一种数据结构,用于判断一个元素是否可能存在于集合中,可以快速过滤掉不存在的数据。布隆过滤器的特点是,高效地插入和查询,占用空间少;查询结果有不确定性,如果查询结果是存在则元素不一定存在,如果不存在则一定不存在;另外它只能添加元素不能删除元素,因为删除元素会增加误判率。在缓存层中使用布隆过滤器,对每个请求的数据进行判断,如果数据不在布隆过滤器中,则可以直接拒绝访问数据库或后端服务。

有关布隆过滤器的具体知识可以参考:
布隆(Bloom Filter)过滤器——全面讲解,建议收藏
布隆过滤器

  • 异常流量监控和限制:通过监控系统中的请求流量,发现异常的高频请求,并对其进行限制或拦截,避免大量的请求直接访问数据库或后端服务。

2.缓存击穿

(1)问题描述:缓存击穿是指在高并发的情况下,一个热点数据的缓存过期失效,导致大量的请求直接访问后端服务,对系统造成巨大的压力,甚至导致系统崩溃

在这里插入图片描述

(2)解决方案

  • 使用互斥锁或分布式锁:当缓存过期时,首先尝试获取一个互斥锁或分布式锁,然后再去后端服务中获取数据。其他请求在锁未释放之前,会等待锁的释放,避免了大量请求同时访问后端服务。
  • 预加载:在缓存失效前,提前异步加载热点数据到缓存中,确保缓存始终可用。可以使用定时任务消息队列等方式实现预加载。
  • 异步缓存更新:在缓存过期时,不立即从后端服务获取数据更新缓存,而是返回旧的缓存数据,并在后台异步更新缓存。这样可以避免由于大量请求同时获取数据而导致的数据库压力过大。
  • 缓存永不过期:对于一些非常重要的热点数据,可以考虑将其缓存设置为永不过期,尽量避免缓存失效的情况。

3.缓存雪崩

(1)问题描述:缓存雪崩是指由于缓存中大量的数据同时失效或过期,导致大量请求直接访问后端系统,从而造成后端系统压力过大,甚至系统崩溃的情况。通常发生在缓存中的数据过期时间设置相近或默认过期时间相同的情况下。

在这里插入图片描述

(2)解决方案

  • 缓存预热:不用等到请求到来再去查询数据库存入缓存,可以提前将数据存入缓存。使用缓存预热机制通常有专门的后台程序去将数据库的数据同步到缓存。
  • 设置随机的缓存过期时间:将缓存失效时间设置为一个随机值,避免大量数据同时过期。可以在原有的过期时间基础上增加一个随机的时间偏移量,使得过期时间分布在一个范围内。
  • 限流降级:在缓存失效的情况下,为了保护后端服务的稳定性,可以对请求进行限流或降级处理,例如通过队列或限流算法来控制请求的并发量,保证系统不被大量请求拖垮。
  • 多级缓存机制:引入多级缓存,例如本地缓存和分布式缓存,提高系统的可靠性。当一级缓存失效时,可以尝试从二级缓存中获取数据,避免直接访问数据库或后端服务。
  • 服务高可用:构建高可用的系统架构,通过横向扩展和负载均衡等方式,降低单个缓存节点失效对整个系统的影响

4.总结

(1)缓存击穿、缓存穿透和缓存雪崩是缓存相关的三个不同问题,它们的原因和影响有所不同:

  • 缓存穿透:缓存穿透是指请求的数据在缓存中不存在,导致每次请求都直接访问数据库或后端服务,对系统造成压力。通常是由恶意请求或者频繁请求不存在的数据引起的,比如查询一个不存在的 ID 或者某种类型的非法输入。缓存穿透会带来大量无效的请求和对后端服务的直接访问。
  • 缓存击穿:缓存击穿是指在高并发的情况下,一个热点数据的缓存过期失效,导致大量的请求直接访问后端服务,对系统造成压力。通常是因为某个特定的热点数据失效,而其他数据的缓存仍然有效。缓存击穿一般是由于并发请求集中在某个特定的数据上,当该数据的缓存过期时,大量请求直接访问后端服务。
  • 缓存雪崩:缓存雪崩是指大量缓存同时失效或过期,导致大量的请求直接访问后端服务,对系统造成巨大的压力。一般是由于缓存系统的故障、过期时间设置不当、或者其他原因导致多个缓存同时失效。缓存雪崩会导致大量请求同时涌入后端服务,造成系统负载过高甚至崩溃。

(2)总结来说,缓存击穿是因为某个热点数据的缓存失效导致并发请求直接访问后端服务,缓存穿透是因为请求的数据在缓存中不存在导致直接访问后端服务,缓存雪崩是由于多个缓存同一时间失效导致大量请求直接访问后端服务。针对这些问题,可以采取不同的解决方案来提高系统的性能和可用性。

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

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

相关文章

23种设计模式汇总详解

设计原则 中文名称英文名称含义解释单一职责原则Single Responsibility Principle(SRP)任何一个软件模块都应该只对某一类行为者负责一个类只干一件事&#xff0c;实现类要单一开闭原则Open-Close Principle(OCP)软件实体&#xff08;类、模块、函数等&#xff09;应该是可以扩…

ChatGpt介绍和国产ChatGpt对比

1.ChatGPT是美国OpenAI研发的聊天机器人程序&#xff0c;2022年11月30日发布。ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过理解和学习人类的语言来进行对话。 2.ChatGPT是一种基于自然语言处理的聊天机器人程序。它使用深度学习技术&#xff0c;通过对…

【Linux】常用工具(下)

Linux常用工具 一、Linux 项目自动化构建工具 - make/Makefile1. 依赖关系和依赖方法2. 伪目标3. make/Makefile 具有依赖性的推导能力&#xff08;语法扩展&#xff09;4. 编写一个进度条代码&#xff08;1&#xff09;缓冲区&#xff08;2&#xff09;\n 和 \r&#xff08;3&…

软件测试-BUG

软件测试-BUG 1.如何合理创建一个BUG 创建bug的要素&#xff1a; 软件的版本发现问题的环境发现问题的步骤预期结果实际结果 Bug报告&#xff1a; 软件版本&#xff1a;Google Chrome浏览器&#xff08;具体版本号&#xff09; 发现问题环境&#xff1a;在Windows 10操作系统…

ASO优化之如何给应用选择竞争对手

在选择竞争对手过程中&#xff0c;最常见的错误之一是没有考虑到自己的应用与同一行业的其他应用相比的范围。例如如果我们刚刚发布了一个应用程序&#xff0c;那么最好的办法就是专注于研究和自己同一级别的应用。 1、研究主要关键词。 首先选择5到10个可以定义产品类型的主要…

什么是ELK

什么是ELK ELK 并不是一个技术框架的名称&#xff0c;它其实是一个三位一体的技术名词&#xff0c;ELK 的每个字母都来自一个技术组件&#xff0c;分别是 Elasticsearch&#xff08;简称 ES&#xff09;、Logstash 和 Kibana。 三个技术组件是独立的&#xff0c;后两个被elast…

【基于Thread多线程+随机数(Random)+java版本JDBC手动提交事务+EasyExcel读取excel文件,向数据库生成百万级别模拟数据】

基于Thread多线程随机数&#xff08;Random&#xff09;java版本JDBC手动提交事务EasyExcel读取excel文件&#xff0c;向数据库生成百万级别模拟数据 基于Thread多线程随机数&#xff08;Random&#xff09;java版本JDBC手动提交事务EasyExcel读取excel文件&#xff0c;向数据库…

《动手学深度学习》(pytorch版+mxnet版)2023最新

我又来推书了&#xff0c;这次分享的这本书可是重量级&#xff0c;目前已经被55个国家300所大学用于教学&#xff0c;同时受到了学术界与工业界的强烈推荐。 这本书就是李沐、阿斯顿张、立顿、斯莫拉四位大佬联合编写的《动手学深度学习》。本书面向中文读者&#xff0c;能运行…

基于SSM的旅游网站系统

基于SSM的旅游网站系统【附源码文档】、前后端分离 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 【主要功能】 角色&#xff1a;管理员、用户 管理员&#xff1a;用户管理、景点…

避免分库分表,绿普惠的分布式数据库选型与实践

作者&#xff1a;翻墨&#xff0c;绿普惠科技&#xff08;北京&#xff09;有限公司架构师 一项数据显示&#xff0c;今天大气中的二氧化碳水平比过去 65 万年高了 27%。主要原因来自于工业化需求下的煤炭燃烧、汽车尾气。随着人类活动造成的温室效应加剧&#xff0c;环保越来越…

小程序开发一个多少钱啊

在今天的数字化时代&#xff0c;小程序已经成为一种非常流行的应用程序形式。由于它们的便捷性、易用性和多功能性&#xff0c;小程序吸引了越来越多的用户和企业。但是&#xff0c;很多人在考虑开发一个小程序时&#xff0c;都会遇到同一个问题&#xff1a;开发一个小程序需要…

JavaWeb基础学习(5)

JavaWeb基础学习 一、Filter1.1 Filter介绍1.2 Filter快速入门1.3、Filter执行流程1.4、Filter使用细节1.5、Filter-案例-登陆验证 二、Listener2.1 Listener介绍2.2、ServletContextListener使用 三、AJAX3.1 AJAX介绍与概念3.2 AJAX快速入门3.3 Axios异步架构3.4 JSON-概述和…

腾讯mini项目-【指标监控服务重构】2023-08-18

今日已办 watermill 将 key 设置到 message 中 修改 watermill-kafka 源码 将 key 设置到 message.metadata中 接入 otel-sdk 添加 middleware resolveUpstreamCtx 解析上游上下文&#xff0c;开启根Span添加 middleware middleware.InstantAck - 马上ACK&#xff0c;使得多…

面试Java后端

sql 五表联合查询 面试八股 JDK&#xff0c;JRE,JVM之间的区别 JDK&#xff0c;Java标准开发包&#xff0c;它提供了编译、运行Java程序所需的各种工具和资源&#xff0c;包括Java编译器、Java运行时环境&#xff0c;以及常用的Java类库等。 JRE(Java Runtime Environment)&…

Learn Prompt-Prompt 高级技巧:AI-town 虚拟小镇

AI-town可能是2023年最令人鼓舞的AI代理实验之一。我们经常讨论单个LLM的突现能力&#xff0c;但 Agents 突现在大规模下可能会更复杂和迷人。一个AI的种群可以展现出整个文明的演化。 &#x1f389;开始阅读前&#xff0c;如果你对其他文章感兴趣&#xff0c;可以到欢迎页关注…

Anaconda下载安装教程,新手详细

Anaconda的安装包下载分为官网下载和清华源下载&#xff0c; ①官网&#xff1a;Anaconda官网 &#xff08;别的博主说官网较慢&#xff0c;有时候还进不去&#xff0c;我感觉还行&#xff0c;2分钟就下载好了。如果不顺利&#xff0c;请尝试使用清华源&#xff09; ②清华源…

机器学习入门教学——损失函数(极大似然估计法)

1、前言 我们在训练神经网络时&#xff0c;最常用到的方法就是梯度下降法。在了解梯度下降法前&#xff0c;我们需要了解什么是损失(代价)函数。所谓求的梯度&#xff0c;就是损失函数的梯度。如果不知道什么是梯度下降的&#xff0c;可以看一下这篇文章&#xff1a;机器学习入…

性能测试 —— Tomcat监控与调优:status页监控

Tomcat服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;Tomcat是Apache 软件基金会(Apache Software Foundation)Jakarta 项目中的一个核心项目&#xff0c;由Apache、Sun 和其他一些公司及个人共同开发而成。 Tomcat是一个轻量级应用服务器&#xff0c;在中小型系统…

DevExpress WinForms图表组件 - 直观的数据信息呈现新方式!(一)

凭借界面控件DevExpress WinForms全面的2D和3D图表类型的集合&#xff0c;DevExpress WinForms的图表控件设计大大简化了开发者直观地向最终用户呈现信息的方式。 DevExpress WinForms有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。同时能完…

IDEA——工程项目的两种窗口开发模式

文章目录 引言一、多项目窗口模式的便利1.1 源码 debug 二、多项目窗口模式的弊端三、多项目窗口的版本管理四、单项目、多项目窗口模式转换 引言 idea编辑器有两种窗口模式&#xff0c;一种是单项目窗口&#xff0c;另一种是多项目窗口。 我个人使用较多的是单项目窗口&#…