Redis排序设置ZSCAN项目顺序



我在Redis中有一个带时间戳的排序集,与该集的不同类型的关系存储在一起。

示例数据集解释如下:

zadd s1 10 rel1:val1  
zadd s1 15 rel1:val2
zadd s1 12 rel1:val3  
zadd s1 10 rel2:v1  
zadd s1 12 rel2:v2
zadd s1 5 rel1:v3  

我正在从集合中寻找rel1或rel2的顶部元素,如果我试图单独存储它们,我将以许多键结束,我想避免这些键。

我尝试了ZSCAN,结果按分数排序,如下

localhost:6379> zscan s1 0 match "rel1*" count 10
1) "0"
2) 1) "rel1:v3"
2) "5"
3) "rel1:val1"
4) "10"
5) "rel1:val3"
6) "12"
7) "rel1:val2"
8) "15"

如果我对时间戳进行评分,我会得到预期的结果,即顶部元素

localhost:6379> zadd s1 -10 rel1:val1
(integer) 0
localhost:6379> zadd s1 -20 rel1:val2
(integer) 0
localhost:6379> zadd s1 -30 rel1:val3
(integer) 0
localhost:6379> zscan s1 0 match "rel1*" count 10
1) "0"
2) 1) "rel1:val3"
2) "-30"
3) "rel1:val2"
4) "-20"
5) "rel1:val1"
6) "-10"
7) "rel1:v3"
8) "5"

我的问题是,我能谈谈这个结果吗?我相信ZSCAN的结果总是按升序排列的。

我不能使用ZREVRANGE或ZRANGE命令,因为我必须通过匹配成员来获得前n个项目。

NO。你不能依赖它。顺序是未定义的。

众所周知,ZSET是用dict/hash和skiplist实现的。ZSCAN命令扫描dict,而不是skiplist。由于dict是无序的,所以扫描结果的顺序是未定义的。

如果使用小样本数据(如给定数据(,则可能会得到正确排序的结果。但不要相信它。

正如@for_stack所说,ZSCAN不遵守结果的顺序。你可以生成大量的样本来测试它,然后你就会发现。您必须切换到ZRANGE、ZREVRANGE或其他方式。

最新更新