V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
firethehole
V2EX  ›  Redis

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

  •  1
     
  •   firethehole · 2021-02-26 15:10:43 +08:00 · 1788 次点击
    这是一个创建于 1402 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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"
    
    4 条回复    2021-02-26 17:34:16 +08:00
    whitehack
        1
    whitehack  
       2021-02-26 15:57:24 +08:00
    http://redisdoc.com/database/scan.html

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

    多谢各位,明白了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2749 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 12:18 · PVG 20:18 · LAX 04:18 · JFK 07:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.