SCAN迭代器
语法
SCAN cursor [MATCH pattern] [COUNT count]
通过类似 分页查询的方式 分批展示 数据库中的key
SCAN 命令是一个基于游标的迭代器(cursor based iterator): SCAN 命令每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。
当 SCAN 命令的游标参数被设置为 0 时, 服务器将开始一次新的迭代, 而当服务器向用户返回值为 0 的游标时, 表示迭代已结束。
以下是一个 SCAN 命令的迭代过程示例:
image.png
可以看到每次执行 会给一个新的游标数字,还有10个key,直到第三次 返回的游标为 0,表示已经迭代完成
MATCH 子句
和 KEYS 命令一样, 增量式迭代命令也可以通过提供一个正则表达式的参数, 让命令只返回和给定模式相匹配的元素, 这一点可以通过在执行增量式迭代命令时, 通过给定 MATCH 参数来实现。
-
*代表任意字符,0到多个
-
?代表一个任意字符
COUNT 子句
虽然增量式迭代命令不保证每次迭代所返回的元素数量, 但我们可以使用 COUNT 选项, 对命令的行为进行一定程度上的调整。
基本上, COUNT 选项的作用就是让用户告知迭代命令, 在每次迭代中应该从<mark style="margin: 0px; border: 0px; padding: 0px; max-width: 100%; box-sizing: border-box;">数据集里返回多少元素</mark>。
虽然 COUNT 选项只是对增量式迭代命令的一种提示(hint), 但是在大多数情况下, 这种提示都是有效的。
-
COUNT 参数的默认值为 10 。
-
在迭代一个足够大的、由哈希表实现的数据库、集合键、哈希键或者有序集合键时, 如果用户没有使用 MATCH 选项, 那么命令返回的元素数量通常和 COUNT 选项指定的一样, 或者比 COUNT 选项指定的数量稍多一些。
-
在迭代一个编码为整数集合(intset,一个只由整数值构成的小集合)、 或者编码为压缩列表(ziplist,由不同值构成的一个小哈希或者一个小有序集合)时, 增量式迭代命令通常会无视 COUNT 选项指定的值, 在第一次迭代就将数据集包含的所有元素都返回给用户。
例子
127.0.0.1:6379[11]› SCAN 0 MATCH z* ## 遍历z开头的key
- "17"
- "zx2"
- "zset2"
- "zmin"
- "z2"
- "zx4"
127.0.0.1:6379[11]› SCAN 0 MATCH z* COUNT 5 ## 遍历z开头的key,每次 读取5个元素
- "20"
- "zx2"
- "zset2"
127.0.0.1:6379[11]› SCAN 0 MATCH z* COUNT 20 ## 遍历z开头的key,每次 读取20个元素
- "3"
- "zx2"
- "zset2"
- "zmin"
- "z2"
- "zx4"
- "zz1"
- "zmax"
- "zx1"
- "z1"
- "zseta"
- "zset1"
127.0.0.1:6379[11]
使用 ZCAN 优缺点:
优点: 每次读取的数量可以控制,所以速度较快,不会造成阻塞
缺点:
同一个元素可能会被返回多次。
如果一个元素是在迭代过程中被添加到数据集的, 又或者是在迭代过程中从数据集中被删除的, 那么这个元素可能会被返回, 也可能不会.