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

【软件测试】盘一盘工作中遇到的 Redis 异常测试

在测试工作中,涉及到与 redis 交互的场景变的越来越多了。关于redis本身就不作赘述了,网上随便搜,本人也做过一些整理。

今天只来复盘一下,在测试过程中与 redis 的二三事儿。其中提到的案例是经过抽象化的,用作辅助说明作用,仅供参考。

一、更新 Key 异常

注意点:先删除原 key 再存,还是直接覆盖原 key?

比如:之前 A 服务每8小时去查询一次数据库,更新到缓存里去。后来需求调整,变成当数据库里有变动的时候就会发送MQ消息给服务 A,然后A就去全量拉取库里数据,再更新到缓存。

开发小哥实现的是先删除key再更新,那么可能会导致这个时间如果有大量的请求进来,就不能命中缓存。于是乎建议,当从数据库拉来数据之后,可以先和redis中原来的key值进行对比,删除多余的缓存,其他的覆盖更新。

二、Key的删除和丢失

注意点:考虑key被删除,或者key丢失后对上游的影响

比如:服务A 会同步一类数据到 redis,然后发消息告诉 服务B。B 收到消息后,拿到 redis 数据去找自己那边 MongoDB里的对应 key,做更新操作,若查不到key,就会删除数据。

此时如果 redis 里产生了数据丢失,key就不存在了,那么同步过后,会导致 MongoDB 里的数据被勿删。

于是乎这里建议方案是:redis 那边涉及要删除key的话,就更新key的值为空[],这时候 MongoDB 查询到值为空的key,就去删除对应数据。 另外,如果redis那边key 丢失了,MongoDB这边也别就删数据了,去调用一个实时接口去查询数据然后更新。

三、KEY 过期策略不当造成内存泄漏

首先回顾一下 redis 中 ttl key指令:

  • 当 key 不存在时,返回 -2
  • 当 key 存在但没有设置剩余生存时间时,返回 -1
  • 否则,返回 key 的剩余生存时间,单位是 s

通常,大多数业务用到redis 都会设置过期时间。接下来,了解一下 key 过期是如何清理的。

定期清理

Redis会定期主动淘汰一批已过期的key(随机抽取一批key检查)。

缺点:可能存在很多KEY已过期,仍未清理。

惰性清理

在获取某个 key 的时候,redis 会检查一下这个 key 如果设置了过期时间并且已经过期,就会删除这个 key,不会返回任何东西。

缺点:如果存在很多未去查询的过期key,就没法走到惰性删除,于是可能会有大量过期的key堆积在内存里,导致内存耗尽。

一般来说,业务会惰性和定期清理配合使用

内存淘汰机制

但是,如果定期清理漏掉了很多过期的key,然后你也没及时去查,也就没走惰性删除。此时依旧有可能大量过期的key堆积在内存里,导致内存耗尽。

这时候需要内存淘汰机制,有如下几个:

  • noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。这个一般很少用。
  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key,这个是最常用的。
  • allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
  • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
  • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
  • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。

以上可以作个了解。

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036【暗号:csdn999】

四、查询Redis异常时处理

很多时候,redis 只是做一个缓存机制,如果redis异常或者未取到数据,是否有实时获取数据的兜底方案(查接口 or 查库?),需要考虑。

五、redis 穿透、击穿、雪崩

穿透

用户想要查询一个数据,发现redis内存数据库中没有,也就是说没有命中缓存,也是会向持久层数据库查询,发现也没有,那么本次查询失败。 如果此时,用户很多,高并发场景下都去查这个数据,由于缓存都没有命中,于是压力直接打到持久层数据库那里,这就是缓存穿透。

解决方案可以用布隆过滤器、返回空对象(设置过期时间)。

击穿

缓存击穿,是指一个key非常热点,在不停的扛着高并发,如果这个key失效了,在失效的瞬间,持续的并发量就会穿破缓存,直接打到持久层数据库,就像一个防御墙被凿开一个洞。

解决方案可以设置热点数据永不过期、加互斥锁等。

雪崩

是指在某一个时间段,缓存集中过期失效,或者redis宕机了。

解决方案:

  • 事前:redis 高可用,主从+哨兵,redis cluster,避免全盘崩溃。
  • 事中:本地 ehcache 缓存 + hystrix 限流&降级,避免 MySQL 被打死。
  • 事后:redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。

六、Redis死锁

Redis锁,小心使用不当造成锁不能释放,陷入死锁。

目前常用的2种锁:

SET Key UniqId Seconds

仅在单实例的场景下是安全的。如果不使用setnx+expire+del中间环节断了仍可能造成死锁; 如果不用SET Key UnixTimestamp Seconds NX,高并发下可能存在相同时间戳。

分布式Redis锁:Redlock

此种方式比原先的单节点的方法更安全。

  • 安全性:在同一时间不允许多个Client同时持有锁。
  • 活性死锁:锁最终应该能够被释放,即使Client端crash或者出现网络分区(通常基于超时机制)。
  • 容错性:只要超过半数Redis节点可用,锁都能被正确获取和释放。

七、Redis持久化

当Redis数据需要长久有效时,需要考虑是否做RDB和AOF持久化,一般RDB和AOF配合使用,但做持久化,会影响性能。

目前接触到的业务做持久化的很少见。比如有个推荐系统Redis数据是长久有效的,但却为了响应快不影响性能,未做持久化,而采用了其他的降级方案Hbase,以及业务的兜底等。

八、缓存与数据库双写时的数据一致性

一般来说,就是如果你的系统不是严格要求缓存+数据库必须一致性的话,允许缓存跟数据库偶尔不一致的情况,那么最后好不要做这个一致性方案。

如果实现这个方案,读请求和写请求串行化,串到一个内存队列里去,这样就可以保证一定不会出现不一致的情况。

但是串行化之后,就会导致系统的吞吐量会大幅度的降低,用比正常情况下多几倍的机器去支撑线上的一个请求。

还有一种适中的方式就是,就是先更新数据库,然后再删除缓存。可能会暂时产生不一致的情况,但是发生的几率特别小。这时候通常并行写数据库和缓存,可以加个事务,都写成功才成功,有一个环节失败了就回滚事务,全失败。

关于双写一致性的问题,其实可以另起一个篇幅来说了,有兴趣的可以网上搜索一下,后续可能会再进行整理。

END,今天的分享就到此结束了,点赞关注不迷路!

相关文章:

【软件测试】盘一盘工作中遇到的 Redis 异常测试

在测试工作中,涉及到与 redis 交互的场景变的越来越多了。关于redis本身就不作赘述了,网上随便搜,本人也做过一些整理。 今天只来复盘一下,在测试过程中与 redis 的二三事儿。其中提到的案例是经过抽象化的,用作辅助说…...

14.Oracle中RegExp_Like 正则表达式基本用法

--基本用法,是否包含某字符串 like %36% select * from k_micfo where regexp_like(loginid,36);if regexp_like(str,^[0-9\.]$) --只包含数字0-9,,小数点.--oracle判断字段是否是纯数字 (四种写法结果一样) select * from k_micfo where r…...

Docker Swarm总结+Jenkins安装配置与集成(5/5)

博主介绍:Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 🍅文末获取源码下载地址🍅 👇🏻 精彩专栏推荐订阅👇🏻…...

docker安装Sentinel zipkin

文章目录 引言I Sentinel安装1.1 运行容器1.2 DOCKERFILE 参考1.3 pom 依赖1.4 .yml配置(整合springboot)II 资源保护2.1 Feign整合Sentinel2.2 CommonExceptionAdvice:限流异常处理类III zipkin引言 消息服务和请求第三方服务可不配置Sentinel。 </...

利用python实现文件压缩打包的功能

主要是利用了zipfile实现文件压缩打包&#xff0c;简单实例代码如下&#xff1a; import zipfilewith zipfile.ZipFile("archive.zip",w) as zipf:zipf.write("config.ini")zipf.write("test.py") 其中的模式 w表示如果没有该文件则创建该文件…...

如何创建百科?建立百科词条的意义何在?九问百科营销

在营销工作实践中&#xff0c;小马识途营销顾问经常接到关于百科营销的咨询&#xff0c;现整理了最受关注的九个问题分享给热爱营销工作的小伙伴。 一、什么是百科营销&#xff1f; 百科营销是借助百科知识传播&#xff0c;可以将企业、品牌、人物所拥有的对用户有价值的信息&a…...

Django如何设置时区为北京时间?

Django默认使用的是UTC时间&#xff0c;北京时间比UTC早8个小时&#xff0c;即如果UTC是凌晨两点&#xff0c;那么北京时间是早上八点。 Django中把setting.py中的语句&#xff1a; TIME_ZONE UTC修改为&#xff1a; TIME_ZONE Asia/Shanghai就把时区改为了北京时间。 这…...

Basemap地图绘制_Python数据分析与可视化

Basemap地图绘制 安装和使用地图投影地图背景在地图上画数据 Basemap是Matplotlib的一个子包&#xff0c;负责地图绘制。在数据可视化过程中&#xff0c;我们常需要将数据在地图上画出来。 比如说我们在地图上画出城市人口&#xff0c;飞机航线&#xff0c;军事基地&#xff0c…...

C#编程题分享(5)

判断质数问题 输⼊⼀个正整数&#xff0c;判断该数是否是质数。如果为质数输出 yes&#xff0c;如果不是输出no 样例输⼊113 输出yes int n Convert.ToInt32(Console.ReadLine()); int count 0; for (int i 1; i < n 1; i) {if (n % i 0) // 判断该数能被整除{coun…...

群晖Video Station 添加海报墙-新方法

海报墙 一般我们找到的都是mp4、mkv等格式的视频资源&#xff0c;而没有像上图这样的海报资源&#xff0c;那要怎样实现海报墙呢&#xff1f; 按照以前的方法&#xff0c;是可以通过The Movie Database的API Key来搜刮电影海报信息&#xff0c;但是现在这个方法不行了 现在介绍…...

【MODBUS】Modbus协议入门简介

Modbus&#xff08;Modicon Communication Protocol&#xff09;是一种用于工业自动化领域的通信协议&#xff0c;最初由Modicon&#xff08;现在是施耐德电气的一部分&#xff09;开发。Modbus协议被广泛应用于连接不同厂商的工业设备&#xff0c;实现设备之间的通信和数据交换…...

ORA-00257: archiver error. Connect internal only, until freed……

今天给客户测 试问题&#xff0c;让客户把数据发过来了。解压缩后一看&#xff0c;他们还是用的oracle 815版本的(他们exp导出时&#xff0c;带了导出日志&#xff0c;从导出日志中看出来是oracle 815版本的)&#xff0c;不过没有关系&#xff0c;低版本的exp是可以用高版本的i…...

继承 和 多肽(超重点 ! ! !)

[本节目标] 1.继承 2.组合 3.多肽 1.继承 1.1 为什么要继承 Java中使用类对现实世界中实体来进行描述&#xff0c;类经过实例化之后的产物对象&#xff0c;则可以用来表示现实中的实体&#xff0c;但是现实世界错综复杂&#xff0c;事物之间可能会存在一些关联&#xff0…...

H265、VP9、AV1视频编码器性能对比

1、背景介绍 目前在视频编解码器中,H264 已经成为绝对的主流,被大部分设备、浏览器所支持。虽然有更先进的编码器推出,但是受限于推广速度和设备支持成本,一直未能成为主流。 今年公司的目标是持续降本增效,现在将”屠刀“指向了视频业务的存储成本。视频文件存储主要两…...

C语言-结构体

---------------------------- ------------------ 岁月漫长心怀热爱&#xff0c;携手共赴星辰大海 --------今天来到我们自定义类型 -----结构体的讲解 目录 结构体的类型声明和初始化 结构体的类型声明 结构体成员的直接访问 结构体成员的间接访问 嵌套结构体进行访问 使用…...

C#拼夕夕自动化登录,电商网页自动化操作。WebView2

单纯靠WebView2是没办法通过JS实现自动登录操作的&#xff0c;包括浏览器插件&#xff0c;都不行&#xff0c;因为大公司对反爬机制控制的还是挺严格。 下面是实现效果&#xff0c;私信我&#xff0c;咨询解决方案。 20231202_153912 C#有偿Q群&#xff1a;927860652博客仅为…...

【Spring Boot 源码学习】BootstrapRegistryInitializer 详解

Spring Boot 源码学习系列 BootstrapRegistryInitializer 详解 引言往期内容主要内容1. 初识 BootstrapRegistryInitializer2. 加载 BootstrapRegistryInitializer3. BootstrapRegistryInitializer 的初始化 总结 引言 书接前文《初识 SpringApplication》&#xff0c;我们从 …...

预览功能实现

需求&#xff1a;将后端返回来的文字或者图片和视频展示在页面上。 <!-- 预览 --><el-dialog title"预览" :visible.sync"dialogPreviewVisible" width"50%" append-to-body :close-on-click-modal"false" close"Previe…...

canvas基础:绘制贝塞尔曲线

canvas实例应用100 专栏提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。 canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重要的帮助。 文章目录 bez…...

高项备考葵花宝典-项目范围管理输入、输出、工具和技术

项目范围管理包括确保项目“做”且“只做”所需的全部工作&#xff08;即不能少做&#xff0c;也不能多做&#xff0c;如果多做&#xff0c;就要消耗团队额外的时间和资源&#xff0c;并且无法被认可&#xff09;&#xff0c;以成功完成项目。项目范围管理主要在于定义和控制哪…...

显存又爆了?移动云弹性KV缓存:让你告别“显存焦虑”

上下文越长&#xff0c;显存越吃紧对话轮次越多&#xff0c;延迟越明显并发量一高&#xff0c;服务就卡顿……随着AI大模型向超长上下文、高并发、多轮交互深度演进&#xff0c;AI推理所需缓存的内容呈指数级增长。显存容量的需求爆炸与显存采购的高昂成本&#xff0c;使得超长…...

别再死记硬背了!用这个‘水管阀门’比喻,5分钟搞懂N沟道和P沟道MOS管工作原理

水管阀门模型&#xff1a;5分钟掌握MOS管的核心逻辑 第一次接触MOS管时&#xff0c;那些载流子、耗尽层、反型层的专业术语就像一堵高墙&#xff0c;把我们对电子世界的好奇心挡在外面。但当我发现可以用厨房水龙头的原理来理解这些抽象概念时&#xff0c;一切都变得清晰起来。…...

从FreeRTOS到RT-Thread:手把手教你正确使用操作系统的动态内存API(避坑malloc)

从FreeRTOS到RT-Thread&#xff1a;嵌入式实时操作系统动态内存管理实战指南 在嵌入式开发领域&#xff0c;动态内存管理一直是开发者面临的棘手问题之一。当项目从裸机迁移到实时操作系统&#xff08;RTOS&#xff09;环境时&#xff0c;许多开发者会不自觉地延续使用标准C库的…...

MongoDB 4.4+ 版本后,手把手教你搞定mongodump独立安装与配置(附环境变量设置)

MongoDB 4.4独立工具链部署指南&#xff1a;从零构建mongodump备份环境 当你在全新的Linux服务器上部署了MongoDB 4.4或更新版本&#xff0c;准备执行例行数据库备份时&#xff0c;在终端输入熟悉的mongodump命令却只得到command not found的响应——这不是你的操作失误&#…...

CTP接口实战:从零构建量化交易系统(附完整源码)

1. CTP接口入门&#xff1a;量化交易的第一块基石 第一次接触CTP接口时&#xff0c;我盯着那堆C代码发呆了半小时——这玩意儿比我想象的复杂多了。后来才发现&#xff0c;其实把它理解成期货市场的普通话就简单了。就像我们用普通话跟人交流&#xff0c;程序用CTP接口跟期货交…...

如何在电脑上完美运行3DS游戏:Citra模拟器5步安装指南

如何在电脑上完美运行3DS游戏&#xff1a;Citra模拟器5步安装指南 【免费下载链接】citra A Nintendo 3DS Emulator 项目地址: https://gitcode.com/GitHub_Trending/ci/citra 想要在电脑上重温任天堂3DS的经典游戏吗&#xff1f;Citra模拟器作为目前最优秀的开源3DS模拟…...

Adobe-GenP终极指南:5分钟免费解锁Adobe全家桶的完整方案

Adobe-GenP终极指南&#xff1a;5分钟免费解锁Adobe全家桶的完整方案 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 还在为Adobe Creative Cloud昂贵的订阅费用而苦…...

告别卡顿!用这款神器轻松下载M3U8格式视频流

告别卡顿&#xff01;用这款神器轻松下载M3U8格式视频流 【免费下载链接】m3u8-downloader 一个M3U8 视频下载(M3U8 downloader)工具。跨平台: 提供windows、linux、mac三大平台可执行文件,方便直接使用。 项目地址: https://gitcode.com/gh_mirrors/m3u8d/m3u8-downloader …...

RobotStudio 仿真软件学习分享05——smart组件创建动态输送链、动态夹具与仿真运行

在工业机器人仿真工作站里&#xff0c;Smart 组件是实现无代码动态逻辑、自动输送、自动夹持、信号交互的核心工具。本次学习我们将从零搭建一套自动上料输送链 智能真空夹具 机器人码垛的完整仿真系统&#xff0c;把 “产品自动生成→输送→到位检测→机器人抓取→搬运码垛→…...

自建个人数字图书馆:基于Go+Vue+SQLite的Alexandria部署与优化指南

1. 项目概述&#xff1a;一个现代数字图书馆的诞生如果你和我一样&#xff0c;是个重度数字内容爱好者&#xff0c;硬盘里塞满了从各种渠道收集的电子书、论文、技术文档、漫画&#xff0c;甚至是整理好的网页存档&#xff0c;那你一定体会过那种“找东西”的痛苦。文件散落在不…...