Redis集群和有序集合

9
在客户端分片方法中,我可以创建一个分片,并在该单个分片中存储一个有序集。使用Redis集群,一个有序集最大能多大?如果它将是我在Redis中所有键的索引,我该如何扩展这些有序集?

你能解释一下你的分片键是什么吗?另外,你想要将你的zset分区到分片中,还是只是将元素分区到分片中?因为根据这里的文档,分区的粒度是键,所以不可能对具有单个巨大键(如非常大的排序集)的数据集进行分片。请查看redis文档:http://redis.io/topics/partitioning - skippy
1个回答

13

简短回答:是的——你可以将所有键名存储在单个有序集合中。

Redis有序集合最多可以拥有2^32-1(4294967295)个成员,每个成员由一个长达512MB的字符串和一个64位分数构成(同样的限制适用于数据库中的键数)。这适用于独立的Redis和Redis集群,并允许在单个有序集合中存储约2048PB的数据 :)

在Redis集群中,每个键都属于特定的哈希槽。因此,无论理论大小限制如何,有序集合的大小只能与你的最大分片(即Redis服务器)一样大。虽然一个分片可以管理一个哈希槽,而一个哈希槽只能容纳一个键——但出于可扩展性考虑,我不建议采用这种方式。

对所有键进行索引是一个有趣的挑战——你为什么要这样做?更重要的是,你想对该索引运行什么类型的查询?根据数据库中键的数量和查询要求,可能会有其他更有效的方法来实现。


如果我的命令是“zadd to_be_expired 142791950 user1”,那么这里的键是to_be_expired,成员是user1。如果我将其他成员添加到zset中,它们是否会存储在同一Redis实例上?因此,如果我使用zset,则单个Redis实例将为所有流量提供服务,对吗? - Phoenix
但是,如果一个单独的服务器承受了所有频繁心跳请求的压力,那就不具有可伸缩性。 - Phoenix
它就是它 - 给定的排序集合(或任何给定的键)驻留在单个分片的单个插槽中。 - Itamar Haber
那么,如果它需要扩展以进行写操作,我需要自己对将进入排序集的键进行分区,对吗? - Phoenix
规模可以达到数百万客户。 - Phoenix
确实 - 将ZSET分区为桶,并跨多个片管理多个桶。使用键哈希标记,您可以将相关用户键基本上定向到与桶相同的哈希槽。 - Itamar Haber

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