面试百问:Redis常见的故障以及发生场景

news2024/9/23 21:27:33

作为一个测试同学,被测系统架构中有使用到redis吗?对redis常见的故障有了解吗?又是如何进行测试的呢?

针对常见的redis面试问题,怎样才算一个高质量的回答呢,回答思路一般包括

问题的类型是什么?

通常会在什么场景发生?(通过使用被测系统的具体场景进行描述,会更加真实可信)

发生的根本原因是什么?(redis等使用较广泛的开源软件,普通问题基本都会有相应的解决方案,发生问题的原因一般是因为使用不当导致)

发生前期要如何避免?(编码时针对问题使用那种方案?测试过程中如何发现该类问题等)

发生后如何进行抢救以及各种方案有什么优缺点等?

一般对于测试同学来说,面试过程中不需要去了解redis的源码和实现方式(当然了解更好),但是对于相应故障场景及原因、解决方案是需要有所了解的。

常见问题
1.缓存雪崩

定义:

由于原来的缓存数据失效,而新的缓存数据还没有更新到缓存中时,导致所有请求都直接去查询数据库,对数据库 CPU 和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。

场景:

比如设置定时过期的数据使用定时任务刷新到缓存就有有可能造成缓存雪崩。假设现在有一个秒杀系统,如果所有首页的Key失效时间都是12小时,中午12点刷新的,零点有个秒杀活动大量用户涌入,假设当时每秒 6000 个请求,本来缓存在可以扛住每秒 5000 个请求,但是缓存当时所有的Key都失效了。此时 1 秒 6000 个请求全部落数据库,数据库必然扛不住,它会报一下警,真实情况可能DBA都没反应过来就直接挂了。此时,如果没用什么特别的方案来处理这个故障,DBA 很着急,重启数据库,但是数据库立马又被新的流量给打死了,这会导致一系列的服务请求数据库都会报错,形成雪崩效应。这就是我理解的缓存雪崩。

解决方案:

批量往Redis存数据的时候,把每个Key的失效时间设置为随机值,这样可以保证缓存中的数据不会在同一时间大面积失效(这种方式一般通过看代码或者询问开发得知失效时间,可通过登录redis服务查询即可测试);

或者设置热点数据永远不过期,此时如果有更新操作就更新缓存就好了(比如运维更新了首页商品,那你刷下缓存就完事了,不要设置过期时间),这样比较保险。

2.缓存穿透

定义:

指缓存和数据库中都没有的数据,而用户不断发起请求导致缓存不命中,这样请求就绕过缓存直接查询数据库。此时如果大量请求穿透缓存访问到 DB,就可能导致数据库压力过大或者挂掉;这种情况一般很有可能是外部的恶意攻击;

场景:

比如数据库的 id 都是1开始自增上去的,如发起为id值为 -1 的数据或 id 为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大,严重会击垮数据库。

解决:

使用 BloomFilter 过滤器,BloomFilter 的特点是存在性检测,如果 BloomFilter 中不存在,那么数据一定不存在;如果 BloomFilter 中存在,实际数据也有可能会不存在;

延伸:布隆过滤器:布隆过滤器(Bloom Filter)的核心实现是一个超大的 bitmap 和 K 个哈希函数。当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,并把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有这个数据了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器的基本思想。
优点:空间效率和查询效率高,且不会漏判,但是会误判

在接口层增加校验,比如用户权限校验,参数做校验,不合法的参数直接代码Return,比如:id 做基础校验,id <=0的直接拦截等

从缓存取不到的数据,在数据库中也没有取到,可以将对应Key的Value对写为null、网络错误、稍后重试等值。这样的值具体取啥看产品,或者具体场景,缓存有效时间可以设置短一些如30秒(设置太长会导致正常情况无法使用)

正常用户是不会在单秒内发起这么多次请求的,网关层Nginx有相关配置项,可以让运维对单个IP每秒访问次数超出阈值的IP都拉黑。

3.缓存击穿

定义:指一个Key非常热点,持续高并发情况下集中对这一个热点数据进行访问,当这个Key在失效的瞬间,持续的高并发就穿破缓存,直接请求数据库,就像在一个完好无损的桶上凿开了一个洞

解决:

可以使用互斥锁,保证同一个进程中针对同一个数据不会并发请求到 DB,减小 DB 压力。

设置热点数据永远不过期。

三者之间异同:三者都是因为缓存没有形成对数据库的有效保护,而导致请求直接到了数据库。不同点:缓存雪崩是大量缓存失效而导致一些列连锁反应;缓存穿透是针对不存在的数据,一般是恶意攻击;缓存击穿是针对具体的热点数据在高并发场景下瞬时失效的情况。

以上缓存雪崩、缓存穿透、缓存击穿如何从redis本身的高可靠性的架构中去避免呢?

一般避免以上情况发生我们从三个时间段去分析:

事前:Redis 高可用,主从+哨兵,Redis cluster,避免全盘崩溃。

事中:本地 ehcache 缓存 + Hystrix 限流+降级,避免MySQL被打死。

事后:Redis 持久化 RDB+AOF,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。

tips:限流组件,是指设置每秒通过请求数的限流工具,一般在集群服务无法再继续扩容的时候使用。使用后可能导致部分请求不通过,但是只会影响一部分。

其他
1.缓存预热

定义:缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题。用户可以直接查询事先被预热的缓存数据。

2.缓存更新

缓存更新除了缓存服务器自带的缓存失效策略之外(Redis 默认的有 6 中策略可供选择),我们还可以根据具体的业务需求进行自定义的缓存淘汰,常见的策略有两种:

(1)定时去清理过期的缓存;

(2)当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数 据并更新缓存。

3.缓存降级

当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,即使是有损服务仍然需要保证服务还是可用的。系统可以根据一些关键数据进行自动降级,也可以配置开 关实现人工降级。降级的最终目的是保证核心服务可用,即使是有损的。但是核心服务是无法降级的 (如加入购物车、结算等主链路上的服务)。走降级!可以返回一些默认的值,或者友情提示,或者空白的值。只要保证数据库不挂,就能保证系统还可用,就只会影响部分体验问题。

4.redis主备切换

主备:即主库和备库,备库只提供备份功能但不提供服务。有的公司可能是主备模式,这就需要SRE配合进行主备切换测试,验证应用服务系统架构设计中是否有主备切换的设计。

5.redis主从切换

主从:主从都提供服务,主库进行写,从库进行读。这时候也需要考虑主从切换过程中,Master是否正常切换为Slave,且切换过程中写是否失败的情况。

最后:下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】
在这里插入图片描述

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

图片

📌 博客主页: 程序员念姐
📌 专注于软件测试领域相关技术实践和思考,持续分享自动化软件测试开发干货知识!
📌 如果你也想学习软件测试,文末卡片有我的交流群632880530,加入我们,一起交流和学习!

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

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

相关文章

Qt应用开发(基础篇)——高级纯文本窗口 QPlainTextEdit

一、前言 QPlainTextEdit类继承于QAbstractScrollArea&#xff0c;QAbstractScrollArea继承于QFrame&#xff0c;是Qt用来显示和编辑纯文本的窗口。 滚屏区域基类https://blog.csdn.net/u014491932/article/details/132245486?spm1001.2014.3001.5501框架类QFramehttps://blo…

使用IDM下载视频出现“由于法律原因,IDM无法下载...

一、问题描述 由于法律原因,IDM无法下载..,如图: 二、原因分析 下载该IDM抓取的M3U8文件,查看其中的内容发现 : #EXT-X-KEY 字段已经写明了加密方式是AES-128,包含一个URI和IV值 #EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:8 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-KEY:…

【机器学习】处理不平衡的数据集

一、介绍 假设您在一家给定的公司工作&#xff0c;并要求您创建一个模型&#xff0c;该模型根据您可以使用的各种测量来预测产品是否有缺陷。您决定使用自己喜欢的分类器&#xff0c;根据数据对其进行训练&#xff0c;瞧&#xff1a;您将获得96.2%的准确率&#xff01; …

分析了下内网穿透技术,都在这了

内网穿透是一种将位于内网中的计算机或设备暴露给公网的技术&#xff0c;以便可以从外部网络访问这些设备。这在许多场景中非常有用&#xff0c;例如远程访问内网中的服务器、搭建本地 Web 服务器、共享文件等。 目前内网穿透一般都以下五种方案 目录 方案一&#xff1a;使用…

Cesium加载ArcGIS Server4490且orgin -400 400的切片服务

Cesium在使用加载Cesium.ArcGisMapServerImageryProvider加载切片服务时&#xff0c;默认只支持wgs84的4326坐标系&#xff0c;不支持CGCS2000的4490坐标系。 如果是ArcGIS发布的4490坐标系的切片服务&#xff0c;如果原点在orgin X: -180.0Y: 90.0的情况下&#xff0c;我们可…

若依的使用(token补充、HTTPS(网络安全)、分页前后端配置)

本文章转载于公众号&#xff1a;王清江唷,仅用于学习和讨论&#xff0c;如有侵权请联系 QQ交流群&#xff1a;298405437 本人QQ&#xff1a;4206359 具体视频地址:8 跑后端_哔哩哔哩_bilibili 1、HTTP&#xff1f; 曾经我们在讲JWT的时候&#xff0c;当时JWT需要配合https…

企业信息化过程----应用管理平台的构建过程

1.信息化的概念 信息化是一个过程&#xff0c;与工业化、现代化一样&#xff0c;是一个动态变化的过程。信息化已现代通信&#xff0c;网络、数据库技术为基础&#xff0c;将所有研究对象各个要素汇总至数据库&#xff0c;供特定人群生活、工作、学习、辅助决策等&#xff0c;…

前端基础(Vue的模块化开发)

目录 前言 响应式基础 ref reactive 学习成果展示 Vue项目搭建 总结 前言 前面学习了前端HMTL、CSS样式、JavaScript以及Vue框架的简单适用&#xff0c;接下来运用前面的基础继续学习Vue&#xff0c;运用前端模块化编程的思想。 响应式基础 ref reactive 关于ref和react…

linux:Temporary failure in name resolutionCouldn’t resolve host

所有域名无法正常解析。 ping www.baidu.com 等域名提示 Temporary failure in name resolution错误。 rootlocalhost:~# ping www.baidu.com ping: www.baidu.com: Temporary failure in name resolution rootlocalhost:~# 一、ubuntu/debian&#xff08;emporary failure i…

提升大数据技能,不再颓废!这6家学习网站是你的利器!

随着国家数字化转型&#xff0c;大数据领域对人才的需求越来越多。大数据主要研究计算机科学和大数据处理技术等相关的知识和技能&#xff0c;从大数据应用的三个主要层面&#xff08;即数据管理、系统开发、海量数据分析与挖掘&#xff09;出发&#xff0c;对实际问题进行分析…

学习笔记230810--get请求的两种传参方式

问题描述 今天写了一个对象方式传参的get请求接口方法&#xff0c;发现没有载荷&#xff0c;ip地址也没有带查询字符串&#xff0c;数据也没有响应。 代码展示 错误分析 实际上这里的query是对象方式带参跳转的参数名&#xff0c;而get方法对象方式传参的参数名是parmas 解…

华为OD机试 - 秘钥格式化 - 双指针(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

条件判断语句

二、判断语句 # 判断语句result10>15 print("10>5的结果是&#xff1a;%s"% result,type(result))eq"yl""yl" print("\"ylyl\" %s"% eq,type(eq))bool_1True bool_2False print(f"打印出类型,{bool_1},类型是{ty…

【论文笔记】MetaBEV: Solving Sensor Failures for BEV Detection and Map Segmentation

原文链接&#xff1a;https://arxiv.org/abs/2304.09801 1. 引言 目前&#xff0c;多模态融合感知中的一大问题在于忽视了传感器失效带来的影响。之前工作的主要问题包括&#xff1a; 特征不对齐&#xff1a;通常使用CNN处理拼接后的特征图&#xff0c;存在几何噪声时可能导致…

2023-8-14 前缀和

原题链接&#xff1a;前缀和 #include <iostream> using namespace std;const int N 100010;int n, m;int a[N], s[N];int main () {scanf("%d%d", &n, &m);for(int i 1; i < n; i ) scanf("%d", &a[i]);for(int i 1; i < n;…

Oracle Database12c数据库官网下载和安装教程

文章目录 下载安装Oracle自带的客户端工具使用 下载 进入oracle官网 点击下载连接之后右上角会有一个下载 我们只需要数据库本体就够了 运行这个下载器 等待下好之后即可 出现 Complete 之后代表下载成功&#xff0c;然后我们解压即可 安装 双击 双击setup.exe 根据…

windows电脑安装了多个版本python 用vscode编程如何指定版本

在状态栏中找到 Python 版本号。这个版本号表示当前正在使用的 Python 解释器版本。 如果需要切换到其他版本的 Python&#xff0c;请点击版本号&#xff0c;然后从列表中选择所需的 Python 版本。列表中的 Python 版本是按照安装顺序排列的。这里一般会有多个版本可供选择

URL编码指南

URL简介 URL 是统一资源定位符&#xff08;Uniform Resource Locator&#xff09;的缩写。它是用于在互联网上定位并访问资源的一种标识方式。 URL通常由以下几个组成部分组成&#xff1a; 协议&#xff08;Protocol&#xff09;&#xff1a;指示要使用的协议&#xff0c;如…

ubuntu 搜狗输入法安装 和 无法输入中文

一、下载搜狗输入法Linux版本。 搜狗输入法linux-首页 二、安装fcitx输入框架&#xff0c;及相关的依赖库 sudo apt install fcitx-bin sudo apt-get install fcitx-table sudo apt --fix-broken install 三、安装搜狗输入法 sudo dpkg -i sougou....deb 四、通过 设置&…

【福建事业单位-综合基础知识】03行政法

【福建事业单位-综合基础知识】03行政法 1.行政法概述&#xff08;原则重点&#xff09;行政主体范围 行政行为总结 二.行政处罚2.1行政处罚的种类总结 行政法框架 1.行政法概述&#xff08;原则重点&#xff09; 行政法的首要原则是合法&#xff1b;自由裁量——合理行政&…