今天看啥  ›  专栏  ›  闲云野鹤_23dd

SCAN迭代器

闲云野鹤_23dd  · 简书  ·  · 2020-12-19 15:30

语法

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

  1. "17"
    1. "zx2"
    2. "zset2"
    3. "zmin"
    4. "z2"
    5. "zx4"
      127.0.0.1:6379[11]› SCAN 0 MATCH z* COUNT 5 ## 遍历z开头的key,每次 读取5个元素
  2. "20"
    1. "zx2"
    2. "zset2"
      127.0.0.1:6379[11]› SCAN 0 MATCH z* COUNT 20 ## 遍历z开头的key,每次 读取20个元素
  3. "3"
    1. "zx2"
    2. "zset2"
    3. "zmin"
    4. "z2"
    5. "zx4"
    6. "zz1"
    7. "zmax"
    8. "zx1"
    9. "z1"
  4. "zseta"
  5. "zset1"
    127.0.0.1:6379[11]

使用 ZCAN 优缺点:
优点: 每次读取的数量可以控制,所以速度较快,不会造成阻塞
缺点:
同一个元素可能会被返回多次。
如果一个元素是在迭代过程中被添加到数据集的, 又或者是在迭代过程中从数据集中被删除的, 那么这个元素可能会被返回, 也可能不会.




原文地址:访问原文地址
快照地址: 访问文章快照