menu dzf
search self_improvement
目录

多数据源的情况下,怎么验证数据一致性问题

dzf
dzf 2022年07月13日  ·  阅读 274

目前的项目架构一般都是多数源的情况,我们项目是采用mysql+redis实现数据存储和读写。MySQL 作为常用的关系型数据库,用于持久化存储大量结构化数据,而 Redis 作为高性能的缓存数据库,能够快速响应数据读取请求并减轻MySQL 的查询压力。然而,在这样的 MySQL 与 Redis 多数据源架构下,数据一致性问题变得尤为关键。一旦两者之间数据出现不一致,可能导致用户获取到错误信息、业务逻辑混乱等不良后果,针对这种情况,我们针对给出对应的测试方案。

一.MySQL 与 Redis 数据交互场景及一致性问题产生原因

首先一张图阐述他们之间的联系,可以了解到他们之间的数据交互逻辑。
屏幕截图 2024-11-30 173744

在常见的应用架构中,MySQL 存储着核心业务数据,例如用户信息、订单数据等。为了提升系统性能,通常会将频繁读取的数据缓存到 Redis 中。数据从 MySQL 写入到 Redis 主要有以下几种情况:

  1. 数据初始化缓存:系统启动或首次运行时,将 MySQL 中的部分数据加载到 Redis 中,以加快后续访问速度。
  2. 数据更新同步:当 MySQL 中的数据发生变更(如新增、修改、删除操作)时,需要将这些变更同步到 Redis 中,以保证缓存数据与持久化数据的一致性。

然而,在这些数据交互过程中,由于网络故障、程序错误、并发操作等多种因素,可能导致 MySQL 和 Redis 之间的数据不一致。例如,在数据更新同步过程中,如果 MySQL 中的数据已经更新,但在同步到 Redis 时出现网络中断,就会造成两者数据不一致。

二.数据一致性验证方法
测试对象是被测服务和redis的交互场景,所以测试核心是围绕数据源的crud,校验被测服务和redis crud的正确性。

c:指的是生成缓存数据
场景模拟方法:通过文档描述或开发描述模拟对应场景,比方说请求生成订单接口就会缓存订单数据。
校验方法:
直接和redis交互,通过redis提供的get方法直接查询订单缓存数据是否存储在redis当中。
可能需要相信开发实现的代码逻辑,查询接口会查询redis,也可以通过删减mysql的数据确保结果是redis返回的,通过请求查询接口校验订单结果是否能正常获取。

r:指的是查询缓存数据
场景模拟方式:前置设计缓存数据,比方说直接写入redis数据或者通过外部某些接口生成缓存数据,通过外部的查询接口再校验查询结果。

需要设计的缓存数据场景:
无缓存(空内容)、MySQL有数据
无缓存(空内容)、MySQL无数据
有缓存(有内容)、MySQL有数据
有缓存(有内容)、MySQL无数据
校验方法:通过外部的查询接口校验,对齐文档内容或研发口径定义期望值,校验结果输出满足期望值。

u:指的是缓存数据更新
本质上就是数据存在缓存时,校验正常的业务更新。
场景模拟方式:前置存在缓存数据时,通过服务提供所有的数据更新方式(接口),再通过服务对外的查询方式校验结果是否是更新后的结果。

d:指的是缓存数据淘汰的校验

常见的缓存数据淘汰机制:

  1. 直接delete
    校验方法:直接校验对外接口的查询结果是否查询不到当前数据
  2. 数据有效期,数据过期后淘汰
    校验方法:校验过期时间的正确性,校验时间的边界值
  3. 自定义的淘汰机制,比方说根据时间排序淘汰离当前时间最远的
    校验方法:校验机制是否符合业务预期,可能需要前置构建数据模拟场景

三.总结
在 MySQL 和 Redis 多数据源架构下,数据一致性验证是保障系统稳定运行和数据准确性的重要环节。在实际应用中,需要根据系统的业务特点、性能要求和数据规模等因素,灵活选择和组合这些验证方法与策略,并不断优化和完善数据一致性保障体系,以适应不断变化的业务需求和技术环境。只有这样,才能确保在 MySQL 和 Redis 多数据源协同工作的情况下,为用户提供准确、可靠的数据服务,提升系统的整体质量和用户体验。

分类:
标签: