scan 0 COUNT 1 为啥会查询出两条数据呢?

2021-02-26 15:10:43 +08:00
 firethehole
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"
1774 次点击
所在节点    Redis
4 条回复
whitehack
2021-02-26 15:57:24 +08:00
http://redisdoc.com/database/scan.html

在迭代一个足够大的、由哈希表实现的数据库、集合键、哈希键或者有序集合键时, 如果用户没有使用 MATCH 选项, 那么命令返回的元素数量通常和 COUNT 选项指定的一样, 或者比 COUNT 选项指定的数量稍多一些。
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),所以会直接返回所有数据。
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 选项产生了误解
firethehole
2021-02-26 17:34:16 +08:00
@whitehack #1
@keakon #2
@zhuisui #3

多谢各位,明白了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/756510

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX