文档首页/ 云数据库 GeminiDB/ GeminiDB Redis接口/ 开发参考/ 通过并行SCAN提升全库扫描速度
更新时间:2024-08-05 GMT+08:00

通过并行SCAN提升全库扫描速度

当实例中的key数量较多时,传统的SCAN命令扫描耗时久,开源Redis较难解决该痛点问题。GeminiDB Redis基于分布式架构,支持用户同时对多个数据分区进行并行扫描,达到并行提速效果。

注意事项

  • 该方案仅适用于GeminiDB Redis集群版实例。
  • 当为SCAN命令指定了PARTITION参数时,返回的cursor在继续扫描时必须指定同一个partition,不能临时更换partition,否则会出现扫描数据不符合预期或者命令报错等情况。

操作步骤

  1. 获取GeminiDB Redis实例的全部分区信息,用于后续的并行扫描。

    数据分区:GeminiDB Redis集群实例底层存在许多数据分区,分布在不同节点上,每个分区名称为一个16字符长度的ID。一个实例底层的数据分区名称和总数量在实例创建时就固定,不会随实例变更而发生改变。

    获取数据分区列表:通过执行INFO ROUTE命令可以获取GeminiDB Redis实例的全部数据分区。如下样例中,查询实例共有4个数据分区:efb06d5c7a4ecb31, c7a36e9eee0103c1, 6fd3dfdbcca37686, 7f7666870a88501b。

    127.0.0.1:6379>info route
     # Route
    server: 127.0.0.1:16379 //展示第一个节点上的数据分区
        efb06d5c7a4ecb31 //数据分区
        c7a36e9eee0103c1 //数据分区
     server: 127.0.0.1:26379 //展示第二个节点上的数据分区
        6fd3dfdbcca37686 //数据分区
        7f7666870a88501b //数据分区

  2. 启动多个SCAN任务,分别扫描不同数据分区,实现并行提速。

    在开源语法基础上,GeminiDB Redis的SCAN命令额外支持了新参数“PARTITION”,支持扫描指定数据分区。因此,用户可基于该特性灵活编写并行扫描脚本,同时对多个数据分区进行SCAN,实现高达数倍的扫描性能提升。

    • 标准SCAN命令语法请参考SCAN
    • GeminiDB Redis新增可选的“PARTITION”参数语法参考:
      SCAN cursor [MATCH pattern] [COUNT count] [TYPE type] [PARTITION partition_index]

      其中,MATCH/COUNT/TYPE参数语法与开源Redis一致;

      • PARTITION参数:指定扫描某个数据分片,当SCAN命令返回的cursor游标为0时,说明该数据分区已扫描完成。
      • partition_index: 是全部数据分片ID的字典序号,从0开始。例如:当实例中共有4个数据分区,则全部分区的partition_index为[0,3];当实例中有240个数据分区,则全部分区的partition_index为[0,239]。例如:
        127.0.0.1:6379> scan 0 count 2 partition 1
        1) "1125900712148994"
        2) 1) "memtier-1"
           2) "memtier-12