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 |