Redis sscan
跳到导航
跳到搜索
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 时:
- Redis 从指定的集合中,根据当前游标的位置,获取一部分元素
- 如果提供了 MATCH 模式,Redis 会过滤这些元素,只保留与模式匹配的元素
- Redis 返回一个包含两个元素的数组:
- 第一个元素是下一次迭代要使用的新的游标值
- 第二个元素是一个数组,包含本次迭代返回的元素
- 当返回的游标值为 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"