127.0.0.1:6379> scan 0 COUNT 1
1) "1"
2) 1) "runoobkeyhash"
2) "runoobkey"
127.0.0.1:6379> scan 1 COUNT 1
1) "3"
2) 1) "runoobkey1"
127.0.0.1:6379> scan 3 COUNT 1
1) "0"
2) (empty array)
127.0.0.1:6379>
127.0.0.1:6379> keys *
1) "runoobkey1"
2) "runoobkeyhash"
3) "runoobkey"
1
whitehack 2021-02-26 15:57:24 +08:00
http://redisdoc.com/database/scan.html
在迭代一个足够大的、由哈希表实现的数据库、集合键、哈希键或者有序集合键时, 如果用户没有使用 MATCH 选项, 那么命令返回的元素数量通常和 COUNT 选项指定的一样, 或者比 COUNT 选项指定的数量稍多一些。 |
2
keakon 2021-02-26 16:16:45 +08:00
原因是这个
https://redis.io/commands/scan#why-scan-may-return-all-the-items-of-an-aggregate-data-type-in-a-single-call 只有当底层实现是 hash table 的时候,cursor 才有意义。出于内存优化的考虑,较小的数据结构(比如只有 2 个 key ),redis 会用 compact single-allocation packed encoding 。这种编码下强行使用 cursor 会导致时间复杂度变成 O(n),所以会直接返回所有数据。 |
3
zhuisui 2021-02-26 16:47:32 +08:00
http://redisdoc.com/database/scan.html 这个中文文档里面 count 相关的翻译完全是错的,看 https://redis.io/commands/scan#the-count-option 的说明,count 选项指定的是 scan 工作(迭代)的次数,指定的是返回结果的数量级。scan 本身不确定每次迭代能返回多少结果。
所以其实是对 count 选项产生了误解 |
4
firethehole OP |