【问题标题】:Should redis zscan on sorted set return my results sorted by score order?排序集上的 redis zscan 是否应该返回按分数顺序排序的结果?
【发布时间】: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 的原因是因为我的分数可能是应用程序不知道的时间戳,以便定义范围,但使用您描述的方法应该允许这样做。谢谢。

标签: redis sortedset


【解决方案1】:

[HSZ]SCAN 系列命令的回复顺序基于 Redis 使用的内部数据结构,其顺序由多个因素决定,但最重要的是由对数据所做的更新决定。排除工程测试和随机巧合 - 无序的回复是预期的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 2023-03-28
    • 2021-08-27
    • 2020-07-22
    相关资源
    最近更新 更多