首页 > redis > redis scan命令的count参数
2017
05-26

redis scan命令的count参数

背景


今天业务功能中想用sscan实现某个功能,突然发现count并不起作用,不管count 传什么,都返回所有的数据

127.0.0.1:6379[13]> sSCAN comment:posts_list_zset_all_20_19097 "" match "*" count 2
1) "0"
2)  1) "2192"
    2) "2193"
    3) "12341"
    4) "12342"
    5) "12343"
    6) "12344"
    7) "12345"
    8) "12346"
    9) "12347"
   10) "12348"
   11) "12349"

查看文档 https://www.runoob.com/redis/sets-sscan.html  ,count - 指定从数据集里返回多少元素,默认值为 10

可是传count为啥不起作用呢???


因为官方直接对sscan的介绍过少:https://redis.io/commands/sscan/

所以我们看他的上一层命令的介绍,在看过官方的文档之后,

英文:https://redis.io/commands/scan/

中文:http://www.redis.cn/commands/scan.html

COUNT选项
对于增量式迭代命令不保证每次迭代所返回的元素数量,我们可以使用COUNT选项, 对命令的行为进行一定程度上的调整。
COUNT 选项的作用就是让用户告知迭代命令, 在每次迭代中应该从数据集里返回多少元素。
使用COUNT 选项对于对增量式迭代命令相当于一种提示, 大多数情况下这种提示都比较有效的控制了返回值的数量。
COUNT 参数的默认值为 10 。
数据集比较大时,如果没有使用MATCH 选项, 那么命令返回的元素数量通常和 COUNT 选项指定的一样, 或者比 COUNT 选项指定的数量稍多一些。

在迭代一个编码为整数集合(intset,一个只由整数值构成的小集合)、 或者编码为压缩列表(ziplist,由不同值构成的一个小哈希或者一个小有序集合)时, 
增量式迭代命令通常会无视 COUNT 选项指定的值, 在第一次迭代就将数据集包含的所有元素都返回给用户。
注意: **并非每次迭代都要使用相同的 COUNT 值 **,用户可以在每次迭代中按自己的需要随意改变 COUNT 值,
 只要记得将上次迭代返回的游标用到下次迭代里面就可以了。


发现描述中有一点。the server will usually return count or a bit more than count....


服务有可能返回比count多一点的元素。


这是因为,在源码中对全局哈希表的每个哈希槽进行遍历,一旦发现拿到的元素个数大于了count,就停止遍历。当一个桶里有多个元素,这时,返回的元素就有可能多于count一点了。


总结


如果是对于集合类型的scan(hscan,sscan...),如果集合元素非常少,导致其底层数据结构为整数数组或压缩列表,那么不管count设置为多少,都会返回全部元素。


其他情况下,scan可能返回少于count个元素(只剩下少于count个数的元素了),可能返回等于count个元素,也可能返回比count多一点的元素。


就像官方文档说的那样,count参数just a hint,只是一个提示作用的参数。

本文》有 0 条评论

留下一个回复