Redis sscan

来自牛奶河Wiki
跳到导航 跳到搜索

SSCAN 是在 Redis 2.8.0 版本中引入,用于迭代集合(Set)类型键中元素的命令。以增量方式检索集合中的元素,避免了一次性取出所有元素(SMEMBERS)可能导致的阻塞问题。类似于 SCAN 命令(用于迭代当前库中所有的键)和 HSCAN 命令(用于迭代哈希类型键中的字段和值)。

语法

SSCAN key cursor [MATCH pattern] [COUNT count]
  • key: 要迭代的集合的键名
  • cursor: 游标,整数。第一次迭代时,游标应设置为 0。每次 SSCAN 调用都会返回一个新的游标,用于下一次迭代。当返回的游标为 0 时,表示迭代完成
  • MATCH pattern (可选): Glob 风格模式(Glob patterns),用于过滤返回的元素,只有与模式匹配的元素才会被返回
  • COUNT count (可选): 指示每次迭代应该尝试返回的元素数量(默认值 10),只是一个大概范围的提示

工作原理

SSCAN 使用游标进行增量迭代。每次调用 SSCAN 时:

  1. Redis 从指定的集合中,根据当前游标的位置,获取一部分元素
  2. 如果提供了 MATCH 模式,Redis 会过滤这些元素,只保留与模式匹配的元素
  3. Redis 返回一个包含两个元素的数组:
    • 第一个元素是下一次迭代要使用的新的游标值
    • 第二个元素是一个数组,包含本次迭代返回的元素
  4. 当返回的游标值为 0 时,表示迭代完成

注意事项

  • COUNT 只是一个大概范围的提示
    Redis 不保证每次 SSCAN 调用都返回恰好 COUNT 个元素,可能会返回更多或更少的元素
  • 迭代过程中集合可能发生变化
    在迭代过程中,集合的内容可能会被其他客户端修改(添加或删除元素)。不能保证返回的元素集合是迭代开始时集合的快照。可能会反映迭代期间发生的更改。
  • 重复元素
    在迭代过程中,同一个元素可能会被返回多次。这是因为 SSCAN 的实现方式,以及集合可能在迭代过程中发生变化。如果应用程序需要确保每个元素只被处理一次,需要处理重复元素的情况(例如,在客户端维护一个已处理元素的集合)。
  • 无序性
    不保证按照任何特定的顺序返回元素,返回元素的顺序取决于内部的哈希表实现。

不同版本 sscan count 结果不同

# Redis 5.0.7,每次返回 count 左右的元素数量
 127.0.0.1:6379> sscan scan_set 0 match A* count 5
 1) "28"
 2) 1) "A23"
    2) "A5"
    3) "A16"
    4) "A7"
    5) "A8"
    6) "A21"
 127.0.0.1:6379> sscan scan_set 28 match A* count 5
 1) "30"
 2) 1) "A13"
    2) "A20"
    3) "A1"
    4) "A17"
    5) "A10"
    6) "A12"
    7) "A14"
 127.0.0.1:6379> sscan scan_set 30 match A* count 5
 1) "5"
 2) 1) "A24"
    2) "A18"
    3) "A2"
 127.0.0.1:6379> sscan scan_set 5 match A* count 5
 1) "27"
 2) 1) "A22"
    2) "A11"
    3) "A3"
    4) "A19"
    5) "A9"
 127.0.0.1:6379> sscan scan_set 27 match A* count 5
 1) "0"
 2) 1) "A25"
    2) "A6"
    3) "A15"
 
 # Redis 7.2.4,每次返回尽可能多的元素数量
 127.0.0.1:6379> sscan scan_set 0 match A* count 5
 1) "0"
 2)  1) "A1"
     2) "A2"
     3) "A3"
     4) "A5"
     5) "A6"
     6) "A7"
     7) "A8"
     8) "A9"
     9) "A10"
    10) "A11"
    11) "A12"
    12) "A13"
    13) "A14"
    14) "A15"
    15) "A16"
    16) "A17"
    17) "A18"
    18) "A19"
    19) "A20"
    20) "A21"
    21) "A22"
    22) "A23"
    23) "A24"
    24) "A25"