被测服务接入Redis时怎么测试

被测服务接入Redis时怎么测试

Administrator 12 2023-12-18

一、背景

  在日常测试工作中,我们总会听到某某项目某某功能用到了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中的缓存更新。

  • 排行榜实时更新

  用户每天做任务攒积分,排行榜需要实时更新。这种需求可以使用到RedisSorted Set(有序集合)来处理。score用来表示用户的积分数,member则表示玩家的唯一标识(如userId)。

  • 社区业务中帖子的推荐、精选状态

  在社区圈子中,用户的行为数据可以存储在Redis中,并基于这些数据生成推荐内容。例如,可以使用RedisSorted Set来存储用户与内容的交互评分,每次用户对内容进行操作时,更新这些分数。然后可以使用这些数据来计算用户对不同内容的兴趣,实时生成个性化的推荐帖子列表。

微信-我的状态-数据流转图.png

- 微信状态功能流程图 -

四、Redis可能实现的缓存策略

  1. 生成数据时同时写入到dbRedis,在请求查询接口时优先查询Redis,命中数据直接返回,未命中数据查询db
  2. 生成数据只写入db,在请求数据的查询接口时优先查询Reids,命中数据直接返回,未命中数据查询db,并把查询到的数据写入到Redis再回调。
  3. 请求生成数据接口和查询接口都不会写入新的数据到Redis,而是通过定时器来实现数据的初始化或增量数据的同步。

五、Redis的相关测试点

  • 校验被测服务和Redis的底层交互逻辑正确性

  1. 未命中缓存:未命中Redis,但命中了db数据,被测服务的外部接口会返回什么结果(通常需要补充额外的校验点确认是db返回的结果,比方说增加Redis直接查询key的校验);未命中Redis,直接返回空结果,前置需要构建db对应的数据,如果返回还是空说明不是没有db查询结果回来。
  2. 命中缓存:需要校验底层是不是查完Redis直接返回结果,而不是从db查询结果回来,前置需要模拟Redis存在数据db不存在数据的情况。
  3. 数据一致性:如果存在多个数据源就可能存在数据一致性的问题,在某些业务逻辑下可能存在数据在不同数据源下不一致的情况。
  4. 缓存淘汰:如缓存超时,了解缓存失效期后需要模拟2种场景,一是未淘汰前几秒查询,二是淘汰后几秒查询,判断缓存时间的配置和机制是否符合预期,根据业务不同还可能存在其它的淘汰策略,比方说保障Redis中的数据只存储100条,当数据存储超过100条时,将距离淘汰时间最近的数据直接delete
  • 校验数据的crud

  1. 生成缓存数据(c):比如请求生成订单接口就会缓存订单数据,可以通过直接和Redis进行交互,通过Redis提供的get方法直接查询订单缓存数据是否存储在Redis中;进一步保障数据查询,可删减对应订单的db数据,再通过请求查询订单接口查询对应订单数据是否正确获取。
  2. 查询缓存数据(r):前置需要设计好缓存数据,比如直接写入Redis或通过某些可用接口生成缓存数据,再通过外部的查询接口来校验查询结果。具体场景有:缓存无数据db有数据、缓存无数据db无数据、缓存有数据db有数据、缓存有数据db无数据;通过查询接口查询后进行校验,对齐开发提供的设计文档而定义的期望值。
  3. 缓存数据更新(u):比如说已有订单缓存数据,通过服务提供的所有的数据更新方式(如修改订单接口)更改了对应订单数据,调用查询订单接口校验缓存数据是否正确更新;对单一数据的处理如果同时存在多个数据源,需要考虑数据一致性问题
  4. 缓存淘汰(d):可以通过直接deleteRedis中的数据后,校验查询结果是否为空(看具体业务,比方说有的业务逻辑是缓存为空时查询db数据);若是根据数据有效期进行淘汰,则需要校验过期时间的正确性以及时间的边界值;若是自定义的淘汰机制,比如根据时间排序来淘汰距离当前时间最远的数据,需要前置构建数据模拟对应的业务场景,校验机制是否符合业务的预期。

六、小结一下

  Redis主要用于实现缓存策略,提高数据的io速率;并且实现热点数据的io,可以有效减轻db的压力,并且利用Redis的数据类型特性,可以更便捷地实现一些业务功能如排行榜等。

  作为测试人员,我们需要了解Redis的基本原理以及数据的增删改查,从业务角度入手,熟悉业务逻辑后对齐开发的设计逻辑,再有针对性地去设计用例、构建数据,才能更好地保障功能上线。