Redis:有序集合的最大分值大小是多少? 分值+唯一id=唯一分值?

5
我正在使用时间戳作为分数。为了防止重复,我将一个唯一的对象id附加到分数后面。目前,这个id是一个6位数字(现在最高的id是221849),但预计会增加到100万以上。所以,分数将是类似于1407971846221849(时间戳:1407971846,id:221849),最终将达到14079718461000001(时间戳:1407971846,id:1000001)。
我的担忧是无法存储分数,因为它们已经达到了最大允许值。
我已经阅读了文档,但有点困惑。我知道基本的数学知识。但请耐心等待,我想弄清楚这个问题。
Redis排序集使用双精度64位浮点数表示分数。在我们支持的所有体系结构中,它被表示为IEEE 754浮点数,能够精确表示介于-(2^53)和+(2^53)之间的整数。更实际地说,-9007199254740992到9007199254740992之间的所有整数都可以完全表示。较大的整数或分数以指数形式内部表示,因此您设置为分数的十进制数或非常大的整数可能仅是近似值。

还有一件事让我困扰。增加id是否会破坏时间顺序?

我将感谢任何见解、建议、不同的观点或者直接告诉我我所做的是无意义的。

感谢您的任何帮助。


你为什么要坚持让分数保持唯一性? - Itamar Haber
我们正在尝试将存储在Riak上的一些播放列表迁移到Redis。它们按最新发布日期(时间戳分数)排序,最新的在顶部。我的问题是当文章进行编辑时,我基本上是通过分数_$redis->zremrangebyscore($key, $score, $score)_进行删除,然后再次进行zadd。一些对象具有相同的发布日期时间戳,因此我想将它们的唯一对象ID附加到其上,使其成为唯一分数,并能够仅删除该对象。 - angelcool.net
既然成员是唯一的,为什么不使用它们来从播放列表中删除过时的条目呢? - Itamar Haber
我了解您是通过分数来删除_sorted sets_中的项目。我们使用时间戳作为分数,因为我们希望集合按照时间顺序排列。因此,我们不能按照唯一标识符删除项目,因为这些标识符不是分数。 - angelcool.net
1
您可以通过成员的分数或指定成员来删除 Sorted Sets 中的成员 - 参见 ZREM: http://redis.io/commands/zrem - Itamar Haber
我看过了,但我们正在存储一个JSON字符串。如果他们进行更改,这个字符串将会改变。 - angelcool.net
2个回答

0
不,它不会破坏“时间顺序”,但您可能会失去最后几位数字的精度,因此两个成员可能会得到相同的分数(即非唯一)。

0

重复分数没有问题。只需在内存中维护一个排序集合即可。成员是唯一的,但分数可能相同。如果您想要按时间顺序处理,我建议仅依赖于时间戳而不添加ID。

添加ID会破坏时间顺序,如果您的ID混合使用,例如您可能有时间戳1、2、3(简单示例)和ID 100、10、1,则无法获得正确的排序。如果您的ID将始终以单调方式添加,则应将ID用作分数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接