面试题:Redis是什么?有什么作用?怎么测试?

news2025/2/25 7:21:46

有些测试朋友来问我,redis要怎么测试?首先我们需要知道,redis是什么?它能做什么?

redis是一个key-value类型的高速存储数据库。
redis常被用做:缓存、队列、发布订阅等。

所以,“redis要怎么测试?”这个问题就可以转化为:

  • 缓存怎么测试?

  • 队列怎么测试?

  • 订阅怎么测试?

在我所接触的技术栈中,发布订阅很少用redis的,我们主要说一说缓存和队列。

1、缓存的分类

缓存有几种类型:文件缓存、数据库缓存、内存缓存、浏览器缓存。

浏览器缓存指的是浏览器自身的缓存能力。现代浏览器为了加快页面加载速度,往往会把css、js等资源文件下载一次之后缓存一段时间,直到缓存失效或者请求明确告知需要更新。

文件类型缓存是早些年非常流行的,比如火遍全国的织梦CMS,在后台编辑文章或者分类页面之后,更新缓存之后立即会生成多个文件,前台访问的时候实际都是访问缓存文件,以此加快访问速度,减少服务器和数据库压力。


通过后端语言直接渲染、smarty等模板渲染方式输出界面的,一般都会选择文件类型缓存。

图片

                                                                文件缓存

随着大前端技术迅速发展,前后端分离越来越流行,smarty渲染的方式使用越来越少,对后端服务的接口响应时间要求也越来越高,文件缓存不再适用这种场景,数据库缓存越来越流行。

数据库缓存目前最常见的:redis和memcached。它们都是分布式的key-value高速缓存系统。

图片

                                                                  redis缓存

内存缓存跟数据库缓存也是类似的,但受技术栈限制,比如Java可以使用,并且Java中使用非常频繁,但PHP无法使用。


内存缓存比数据库缓存更快,但因为内存不可能一直增加,所以限制更多,稍不注意就会出现内存泄漏等问题。

在实际的使用过程中,Java接口往往会将部分高频数据塞到内存缓存中作为一级缓存,次高频数据塞到redis中作为二级缓存,最后再从db查询数据。

图片

                                                                       组合使用

2、缓存的作用和使用场景

  • 作用:

从上面的内容你可能已经知道,缓存最重要的两个作用:加快访问速度、减少服务器和db压力。

  • 使用场景:

你可能会问,上面这些跟测试没啥关系啊?不,我认为了解上面的内容对测试还是有帮助的。


你知道在技术实现上,什么时候应该加缓存,什么时候不应该加缓存吗?这就是对一个接口的技术把控,不光开发需要知道,测试人员也一样。


如果一个应该添加缓存的接口没有添加缓存在压测之前被你提前发现了,你不觉得自豪吗?

图片

其实跟缓存的作用一一对应,当接口的qps较高(比如超过100)或者对响应速度有要求,或者服务器性能、db性能较差的,都可以尝试使用缓存解决问题。

我举几个例子说明:

  • 微信新版本中,个人中心多了一个“状态”功能。

微信的用户体量非常庞大,访问qps非常高,几十万人在同一秒访问,不可能每次都去查询数据库。

类似这种需求,一般会是这样的做法:

先把用户的状态数据缓存在app中(浏览器缓存),在某个时间段通过主动推或者被动拉的方式调用后端接口请求“状态”数据;接口从redis/memcached的缓存中读取数据并返回;如果数据量不那么庞大,接口可以直接从内存缓存中读取数据并返回;数据返回后,再把用户app中的缓存更新。

图片

  • 有一个小型电商的商品管理后台列表页面,访问人数不多,sku改动频次很低,可能3天才被访问几十次。


这种场景一不需要使用缓存,二在商品信息被更新之后需要立即看到更新后的数据,不适合使用缓存,所以不建议使用缓存。

同样的电商管理后台,这次是一个统计页面,统计昨天/今天/近一周的商品销售情况。这个场景可以分情况来看,有多种不同的解决方案。(我们抛开大数据统计的各类技术方案,简单实现一个系统的统计功能)

  • 不需要实时统计

    只需要定时统计一次即可,比如只看昨天一天统计数据:可以由定时脚本统计之后直接存储在db,需要查看统计数据时直接查询db即可
     

  • 需要查询实时统计数据

    需要查询的各个统计sql执行效率满足预期:每次查看数据直接查询db即可,此时db压力不大
     

  • 需要查询实时统计数据

    且因业务数据庞大,各个统计sql执行效率非常低或无法直接统计:可以汇总各个指标,将统计值维护在缓存中,比如需要销量信息,每售出一件商品,销量统计值缓存+1,查看统计数据时查询此时的缓存即可

3、缓存的生成方式

了解到缓存的使用场景之后,我们来说说缓存的生成方式。一般来说,缓存有两种使用方式,我简单概括为:外面里面。先来说说一个接口的请求到了程序里,是怎么处理的:

图片

                                                                程序处理流程

这是一个典型的MVC,由Controller接收和处理请求数据,由Service处理Model中获取的数据,再由View输出。

对不同场景,我们可以采取多种方式,在多个节点增加不同的缓存,来解决不同的问题。

比如,针对请求参数多变,返回的数据如果跟请求参数强相关,适合在“外面”(请求参数过滤之后)缓存查询到的数据。这类数据一般缓存时间短,比如缓存5分钟。主要应对相同请求参数在短时间内的重复请求。如果遇到请求攻击,即使这个缓存有效期只有1秒,也是很有效的,能挡住大量的请求。

图片

                                                                在“外面”缓存

比如,针对请求参数变化不大,返回的数据跟db中存储的数据很接近的情况,适合在“里面”缓存数据,也就是在更新db的同时更新缓存,这种情况最优的状态下,只需要读缓存就够了,不需要跟db直接交互,能大大缓解db压力。这种缓存有效期可以设置很长。

图片

                                                                在“里面”缓存

4、缓存的更新方式

说完生成,再来说说缓存的更新,缓存在生成之后,正常都不会一成不变,所以需要对缓存进行更新。


有几种更新方式:

  • 过期后自动更新

    这是最懒的更新方式。通过设置缓存有效期,让缓存失效后通过新的请求自动创建新的缓存。

  • 删除缓存

    在更新db数据后,直接删除缓存,通过新的请求自动创建新的缓存。

  • 重新设置缓存

    在更新db数据后,直接重新设置缓存。

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

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

相关文章

AI时代新爬虫:网站自动转LLM数据,firecrawl深度玩法解读

在大模型的时代,爬虫技术也有了很多新的发展,最近出现了专门针对大模型来提取网站信息的爬虫,一键将网页内容转换为LLM-ready的数据。今天我们介绍其中的开源热门代表:firecrawl。 firecrawl 是什么 FireCrawl是一款创新的爬虫工…

文件初阶入门(葵花宝典)

1. 文件的顺序读写 1.1 顺序读写函数的介绍 函数名 功能 适用于 fgetc 字符输入函数 所有输入流 fputc 字符输出函数 所有输出流 fgets 文本行输入函数 所有输入流 fputs 文本行输出函数 所有输出流 f…

hrm人力管理系统源码(从招聘到薪酬的全过程人力管控系统)

一、项目介绍 一款全源码可二开,可基于云部署、私有部署的企业级数字化人力资源管理系统,涵盖了招聘、人事、考勤、绩效、社保、酬薪六大模块,解决了从人事招聘到酬薪计算的全周期人力资源管理,符合当下大中小型企业组织架构管理运…

【FPGA】静态分析与时序约束(持续更新

Reference: V2静态时序分析与时序约束文档 入门 无时序约束场景中,普通图像显示不清晰,千兆网口接收Ethernet package 数据不正常,红外场景中图像显示不正常 Definition: 我们提出一些特定的时序要求(或…

Application Studio 学习笔记(2)

一、rest-erp 1、设置需要调用的BO服务名和BO方法名 2、设定BO方法的参数 方法的参数名已经自动获取,常规类型的参数取值直接在Method Parameters中设定 DataSet类型的参数取值,需要在Request Parameters中设定 设置Parameter Path为DataSet参数名&…

安川机器人MA1440减速机维修方法

一、安川机械臂减速器维修方法 1. 齿轮磨损维修 对于轻微磨损的齿轮,可以通过重新调整啮合间隙来恢复性能。对于严重磨损的齿轮,需要更换新安川MA1440机械手齿轮箱齿轮。 2. 轴承损坏维修 对于损坏的轴承,需要更换新的轴承。在更换过程中&…

【LLM之RAG】Adaptive-RAG论文阅读笔记

研究背景 文章介绍了大型语言模型(LLMs)在处理各种复杂查询时的挑战,特别是在不同复杂性的查询处理上可能导致不必要的计算开销或处理不足的问题。为了解决这一问题,文章提出了一种自适应的查询处理框架,动态选择最合…

【文心智能体分享】日记周报助手

引言 在繁忙的实习生活中,你是否曾为如何整理日常的工作日志、周报、月报而烦恼?现在,我们为你带来了一个全新的智能体——“日记周报助手”,它将成为你实习过程中的得力助手,帮你轻松整理实习日志,让你的…

运算符分为哪几类?哪些运算符常用作判断?简述运算符的优先级

运算符包含6大类:算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、三元(目)运算符。 逻辑运算符常用作布尔判断 typeof 运算符: typeof 运算符用于确定变量或表达式的数据类型,并返回一个表示类型的字符串。 typeof …

grpc代理服务的实现(一)

最近公司需要无感知基于服务代号来实现通信, 并监控和管理通信连接,目前公司使用的是如下的逻辑(当然逻辑简化了,但是思想不变) 目录 简单的原理图代理服务的实现创建 tls tcp 服务, 用于grpc client 和 grpc service 通信保存 与 代理服务建立的 grpc …

【docker实战】使用代理的坑

在docker公共仓库被封禁的日子里,大多数人更喜欢使用镜像仓库代理源。 网上教程一大把,似乎不使用代理,就不会使用docker一样。 上图就是我设置的代理源镜像仓库。通常是设置/etc/docker/daemon.json这个文件实现的。 这样设置之后&#xff0…

李永乐线代笔记

线性方程组 解方程组的变换就是矩阵初等行变换 三秩相等 方程组系数矩阵的行秩列秩,线性相关的问题应求列秩,但求行秩方便 齐次线性方程组 对应向量组的线性相关,所以回顾下线性相关的知识: 其中k是x,所以用向…

django.db.utils.NotSupportedError: MySQL 8 or later is required (found 5.7.33).

django.db.utils.NotSupportedError: MySQL 8 or later is required (found 5.7.33). 一、原因分析 在新版的Django默认需要MySQL 8或更高版本,才能运行。 二、解决办法 1、升级mysql数据库版本 只需要将mysql版本升级到8.0,即可解决,当然这…

达梦导入导出

针对导出数据库表结构通常有 3 种方法: 使用 DTS 导出 打开 DTS 迁移工具,选择【DM-->SQL】并链接到数据库中,如下图所示: 添加定义脚本,并选择【迁移范围】(仅迁移对象定义),如…

202478读书笔记|《人间小满》——小满,才是最好的人生状态,养身先养心,知世故而不世故,历圆滑而弥天真

202478读书笔记|《人间小满》——小满,才是最好的人生状态,养身先养心,知世故而不世故,历圆滑而弥天真 一、画出世俗的欢喜,过一种平淡自由的人生二、与时舒卷,抵岁月荒唐三、一半是海水,一半是…

帕金森的锻炼方式

帕金森病,这个看似陌生的名词,其实离我们并不遥远。它是一种常见的神经系统疾病,影响着许多中老年人的生活质量。虽然帕金森病目前尚无根治之法,但通过科学合理的日常锻炼,可以有效缓解病情,提高生活质量。…

【中台】数字中台整体建设技术方案(doc原件获取)

1. 中台概念 2. 推动企业组织模式演进 3. 建设方法 4 .中台内容 5. 数据安全体系 中台内容围绕数据中台建设评估、整体框架、数据采集,结构化、半结构化、非结构化的数据采集,数据计算能力、存储计算引擎、数据架构、数据挖掘、各种不同数据层建设、模型…

一款不写代码的开源爬虫工具!!【送源码】

爬虫,也被称为网络爬虫或网络蜘蛛,是一种自动化的网络机器人,其主要功能是按照一定的规则,自动浏览互联网并从网页中提取信息。 作为一个开发人员,相信大家都尝试过写一些爬虫,合理的利用一些爬虫工具&…

异或运算在面试题中的应用

异或运算 是 涉及到数据位运算时常见的处理方式。如何进行异或运算?在对应位上,相同为0,不同1,但其实两个数据异或运算就是进行无进位加法。 例如: int a 7, b 6, a ^b ? 算法1: 相同为0,不同为1 a …

和鲸科技携手浙江大学地球科学学院,助推地球科学研究范式变革

近日,浙江省资源与环境信息系统重点实验室(下简称“实验室)与上海和今信息科技有限公司(下简称“和鲸科技”)签订合作框架协议,双方将以助推“数据算力模型科研场景”的地球科学研究范式变革,孕…