通过并行SCAN提升全库扫描速度
当实例中的key数量较多时,传统的SCAN命令扫描耗时久,开源Redis较难解决该痛点问题。GeminiDB Redis基于分布式架构,支持用户同时对多个数据分区进行并行扫描,达到并行提速效果。
注意事项
- 该方案仅适用于GeminiDB Redis集群版实例。
- 当为SCAN命令指定了PARTITION参数时,返回的cursor在继续扫描时必须指定同一个partition,不能临时更换partition,否则会出现扫描数据不符合预期或者命令报错等情况。
操作步骤
- 获取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 //数据分区
- 启动多个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