一、背景
在日常测试工作中,我们总会听到某某项目某某功能用到了Redis
,好像Redis
被使用的频率越来越高,越来越多的核心功能开始依赖Redis
来提高数据访问速度和系统响应性能,那么对于我们测试人员来讲,针对被测服务
和Redis
集成的策略设计对应的测试方法至关重要。
首先我们需要确保的是系统在集成后的稳定性
、性能
和可靠性
。以及逐步引入更复杂的场景,例如数据一致性验证
、异常情况处理
和高负载性能测试
等。目的是为了验证缓存策略的有效性,以及发现潜在的问题和性能瓶颈,确保其对系统整体性能的积极影响。
二、Redis是什么
Redis
全称为:Remote Dictionary Server(远程数据服务)
,是一个使用ANSI C语言编写,开源的、支持网络、基于内存亦可持久化的、Key-Value
的非关系型数据库
。支持丰富的数据类型,如:String、list、set、zset、hash
等。
Redis
的数据都基于缓存的,所以很快,每秒可以处理超过10万次读写,是已知性能最快的Key-Value DB。也可以实现写入磁盘中,保证了数据的不丢失,而且Redis的操作是原子性的。
三、Redis的应用场景都有哪些
- 微信个人中心的状态功能
微信的用户体量非常庞大,访问qps非常高,几十万人在同一秒访问,不可能每次都去查询数据库。类似这种需求,一般我们会采取这种做法:先把用户的状态数据缓存在浏览器/App中(客户端缓存),在某个时间段通过主动推或者被动拉的方式调用后端接口请求“状态”数据;接口从
Redis
(也可能是其它缓存中间件)的缓存中读取数据并返回;如果数据量不那么庞大,接口可以直接从内存缓存中读取数据并返回;数据返回后,再把用户app中的缓存更新。
- 排行榜实时更新
用户每天做任务攒积分,排行榜需要实时更新。这种需求可以使用到
Redis
的Sorted Set
(有序集合)来处理。score
用来表示用户的积分数,member
则表示玩家的唯一标识(如userId)。
- 社区业务中帖子的推荐、精选状态
在社区圈子中,用户的行为数据可以存储在
Redis
中,并基于这些数据生成推荐内容。例如,可以使用Redis
的Sorted Set
来存储用户与内容的交互评分,每次用户对内容进行操作时,更新这些分数。然后可以使用这些数据来计算用户对不同内容的兴趣,实时生成个性化的推荐帖子列表。
四、Redis可能实现的缓存策略
- 生成数据时同时写入到
db
和Redis
,在请求查询接口时优先查询Redis
,命中数据直接返回,未命中数据查询db
。 - 生成数据只写入
db
,在请求数据的查询接口时优先查询Reids
,命中数据直接返回,未命中数据查询db
,并把查询到的数据写入到Redis
再回调。 - 请求生成数据接口和查询接口都不会写入新的数据到
Redis
,而是通过定时器来实现数据的初始化或增量数据的同步。
五、Redis的相关测试点
校验被测服务和Redis的底层交互逻辑正确性
- 未命中缓存:未命中
Redis
,但命中了db
数据,被测服务的外部接口会返回什么结果(通常需要补充额外的校验点确认是db
返回的结果,比方说增加Redis
直接查询key的校验);未命中Redis
,直接返回空结果,前置需要构建db
对应的数据,如果返回还是空说明不是没有db
查询结果回来。- 命中缓存:需要校验底层是不是查完
Redis
直接返回结果,而不是从db
查询结果回来,前置需要模拟Redis
存在数据db
不存在数据的情况。- 数据一致性:如果存在多个数据源就可能存在数据一致性的问题,在某些业务逻辑下可能存在数据在不同数据源下不一致的情况。
- 缓存淘汰:如缓存超时,了解缓存失效期后需要模拟2种场景,一是未淘汰前几秒查询,二是淘汰后几秒查询,判断缓存时间的配置和机制是否符合预期,根据业务不同还可能存在其它的淘汰策略,比方说保障
Redis
中的数据只存储100条,当数据存储超过100条时,将距离淘汰时间最近的数据直接delete
。
校验数据的crud
- 生成缓存数据(c):比如请求生成订单接口就会缓存订单数据,可以通过直接和
Redis
进行交互,通过Redis
提供的get
方法直接查询订单缓存数据是否存储在Redis
中;进一步保障数据查询,可删减对应订单的db
数据,再通过请求查询订单接口查询对应订单数据是否正确获取。- 查询缓存数据(r):前置需要设计好缓存数据,比如直接写入
Redis
或通过某些可用接口生成缓存数据,再通过外部的查询接口来校验查询结果。具体场景有:缓存无数据db有数据、缓存无数据db无数据、缓存有数据db有数据、缓存有数据db无数据
;通过查询接口查询后进行校验,对齐开发提供的设计文档而定义的期望值。- 缓存数据更新(u):比如说已有订单缓存数据,通过服务提供的所有的数据更新方式(如修改订单接口)更改了对应订单数据,调用查询订单接口校验缓存数据是否
正确更新
;对单一数据的处理如果同时存在多个数据源,需要考虑数据一致性问题
。- 缓存淘汰(d):可以通过直接
delete
掉Redis
中的数据后,校验查询结果是否为空(看具体业务,比方说有的业务逻辑是缓存为空时查询db数据);若是根据数据有效期进行淘汰,则需要校验过期时间的正确性
以及时间的边界值
;若是自定义的淘汰机制,比如根据时间排序来淘汰距离当前时间最远的数据,需要前置构建数据模拟对应的业务场景,校验机制是否符合业务的预期。
六、小结一下
Redis
主要用于实现缓存策略,提高数据的io速率;并且实现热点数据的io,可以有效减轻db
的压力,并且利用Redis
的数据类型特性,可以更便捷地实现一些业务功能如排行榜等。
作为测试人员,我们需要了解Redis
的基本原理以及数据的增删改查,从业务角度入手,熟悉业务逻辑后对齐开发的设计逻辑,再有针对性地去设计用例、构建数据,才能更好地保障功能上线。