
# 通过并行SCAN提升全库扫描速度
当实例中的key数量较多时，传统的SCAN命令扫描耗时久，开源Redis较难解决该痛点问题。GeminiDB Redis基于分布式架构，支持用户同时对多个数据分区进行并行扫描，达到并行提速效果。
#### 注意事项
- 该方案仅适用于GeminiDB Redis集群版实例。
- 当为 SCAN 命令指定 PARTITION 参数时，同一个分区的后续扫描必须继续使用相同的 partition_index 和上一次返回的 cursor，直到 cursor 返回 0。不同分区应分别维护各自的 cursor，不能混用。
 
#### 操作步骤
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](https://redis.io/docs/latest/commands/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
       ```
       
      
   
   
   
   
 
