背景
今天业务功能中想用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"
可是传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 条评论