Skip to content

记一个数据遍历方案优化的case #11

@gaoxianglong

Description

@gaoxianglong

背景

假设A表中有M条数据,定时器会定时从中读取N条数据,当把A表中所有数据读取完后则意味着一轮遍历结束,然后再重新对A表进行遍历,每一轮遍历过程中不能够读取重复数据。

现有方案

A表中维护一个version字段,假设值为1,然后redis中也维护一个全局的version缓存项,假设值为2。在遍历A表的过程中,区分数据未被读取的判断条件就是db.version < redis.version,被读取的数据会递增A表中的版本号,当一轮遍历结束后,redis同样也会递增全局版本号,然后再按照相同的规则持续遍历A表中的数据。

优化方案

首先去掉A表中的维护的version字段,以及所依赖的redis。

在A表中维护一个时间字段‘scan_time’,然后在每一轮遍历的查询过程中,基于‘scan_time’对数据进行ASC升序排序,读取过的数据,需要将‘scan_time’更新为now(),即可解决每一轮遍历过程中数据重复读取的问题。这个方案的核心思路是抽象出一个时间环,然后把基于‘scan_time’ ASC排序的数据想象成会均匀分布到这个时间环上,当顺时针读取过的数据行数的‘scan_time’被更新后,目标数据自然会被重新分布在时间环上靠后的位置上,当重新读取到这一行数据的时候,也就意味着已经开启了新一轮的数据遍历任务。
image

图1 基于时间环的数据遍历方案

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions