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

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

作为一个测试同学,被测系统架构中有使用到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,且切换过程中写是否失败的情况。

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

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

视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

http://www.cnnetsun.cn/news/69835.html

相关文章:

  • 如何用FLUX.1-dev镜像在本地部署下一代AI绘画模型?
  • 基于 Comsol 移动网格方法的激光熔池流动数值模拟
  • BLDC无刷直流电机Matlab仿真:转速电流双闭环控制及有感无感换相方式研究
  • [光学原理与应用-491]:水冷机、零气模块CDA、功率计等影响266皮秒紫外激光器的种子源1064nm功率稳定性结果的主要因素有哪些?
  • 昆仑通态MCGS与欧姆龙E5CC温控器通讯实战:PID模式及输出启停控制
  • 通达信〖逆势突破强牛〗指标公式 逆市环境中率先突破前期重要压力位 较强内在上涨动力
  • 基于扰动观测器的永磁同步电机(PMSM)模型预测控制(MPC)仿真探索
  • AEB联合仿真算法设计:Carsim2019.0+Matlab/Simulink2021a实现...
  • Java毕设选题推荐:基于springboot个人博客系统的设计与实现基于SpringBoot+Vue个人博客系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Java毕设选题推荐:基于springboot停车场车位预约系统基于Java springboot停车场管理系统停车位预约【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Java毕设选题推荐:基于springboot的无人化、线上化、数据化海洋馆预约系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Ascend C高级API应用:InitGlobalMemory与Pad操作的底层原理
  • Java毕设选题推荐:基于Java Web的新能源汽车信息咨询服务基于SpringBoot+Vue的新能源汽车信息咨询服务的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:OPA 集成指南:从原理到实践
  • Object.defineProperty和Proxy实现拦截的区别
  • 若依物联网
  • PSEN1抗体:如何揭示阿尔茨海默病致病机制与治疗新靶点?
  • Docker Engine 升级指南:保障容器安全的关键步骤
  • 基于zigbee灯光控制照明及色温调节系统的设计与实现(有完整资料)
  • 7、Python高级语法:描述器、属性与元编程实战
  • 【开题答辩全过程】以 基于java技术的校园一卡通系统的设计与实现为例,包含答辩的问题和答案
  • 11、Python 包与应用开发全解析
  • django基于智能推荐算法的全屋定制平台网站设计
  • 详谈:解释器模式(四)
  • 双Buck电路并联下的下垂控制与VDCM协同控制策略:增强直流微电网稳定性的仿真应用
  • Java 日期格式化方法:SimpleDateFormat 和 DateTimeFormatter
  • GPU 渲染模式:OpenGL ANGLE Vulkan 的选择与切换(工程师不踩坑指南)
  • 【dz-968】室内空气监测系统设计
  • 【接口测试】5_接口测试基础 _接口文档解析
  • 最近在搞风光储联合发电系统的仿真,发现直驱风机和光伏逆变器的配合特别有意思。今天就跟大伙儿唠唠这个模型搭建时遇到的坑,顺便分享几个关键模块的调参心得