【发布时间】:2015-07-17 04:35:20
【问题描述】:
对于我正在开发的应用程序,我正在研究使用 Redis 中的排序集来存储带有时间戳作为分数和任意消息作为成员的项目。然后我打算使用 zscan 来从排序集中检索项目按顺序。顺序对应用程序很重要,这就是我要使用排序集的原因。
事情似乎进展顺利,直到我尝试使用 zscan 检索项目并且它们似乎出现故障。例如,我设置了一个测试,将 1000 个项目添加到排序集中,使用整数值作为分数,字符串表示作为成员(为简洁起见,省略了初始化):
for( int i = 0; i < 1000; i++){
jedis.zadd(CHANNEL, i, Integer.toString(i));
}
ScanResult<Tuple> result = jedis.zscan("TEST_CHANNEL", "0", new ScanParams().count(10));
我拿回来的物品似乎是随机排列的。使用 redis-cli 运行 zscan 确认了测试发现的相同结果:
127.0.0.1:6379> zscan "TEST_CHANNEL" 0
返回结果125、588、568、144.....
从 0 到 10 的 zrange 正确返回从“0”到“10”的成员。
我已经尝试查看文档 (http://redis.io/commands/zscan),但我找不到任何东西来确认 zscan 是否应该或不应该按分数顺序返回结果,并希望有人能澄清我是否看到了错误,预期的行为,或者只是做错了。
我使用的是 Redis 3.0.1
【问题讨论】:
-
在排序集的情况下,如果需要有序迭代器,可以使用 ZRANGEBYSCORE 进行迭代,这是可能的,因为到远分数的寻道时间是对数的,所以这是有序的方法迭代。请记住,您将需要 LIMIT 和 WITHSCORES 才能知道在哪里限制返回的项目数量(因为您通常希望使用 +inf 作为范围的结尾),并了解您的下一个分数是多少我想问问。
-
@antirez 啊,是的,这可以工作。我避免 ZRANGEBYSCORE 的原因是因为我的分数可能是应用程序不知道的时间戳,以便定义范围,但使用您描述的方法应该允许这样做。谢谢。