在Aerospike中模拟数百万存在检查的最佳方法?

时间:2014-10-28 09:12:41

标签: redis data-modeling aerospike

对于某些数据结构已经从Redis发展而来,我正在寻找具有良好磁盘/ SSD性能的其他解决方案。我最近发现Aerospike似乎在SSD环境中表现出色。

最需要内存的结构之一是大约100.000个Redis集,每个集最多可包含10.000个字符串。每个字符串介于10到30个字符之间。

这些集主要用于存在/唯一性检查。

对这些进行建模的最佳方法是什么?我一般看到2个选项: *将redis设置为Aerospike lset *分别对一组中的每个值进行建模。

除了这个选择,100.000 Redis集用作键上的分区。出于本地化的原因,在Aerospike中进行类似的分区/命名空间可能是有意义的。但是,我非常确定'命名空间'在Aerospike中并没有用于这种密钥分区。在Aerospike中执行此操作的正确方法(如果有的话)是什么,或者是不需要的?

2 个答案:

答案 0 :(得分:6)

Aerospike为负载平衡和高可用性需求进行自己的分区。命名空间与传统意义上的数据库同义, NOT 与数据分区同义。命名空间中的数据被分区并存储在群集中。您作为用户无需担心数据的放置。

我会将Redis设置为Aerospike“lset”(一对一)。 Aerospike应该处理给定“lset”中数据的数据位置。

答案 1 :(得分:5)

是的,你不应该担心Aerospike进行自动分片时数据的位置。这确保了在群集的所有节点之间平衡数据分布和读/写负载。

放入lset有其优点。它提供类似于redis的功能,您无需编写自己的功能。但与此同时它也有它的不满。因此,您应该根据您的要求进行选择。单个集合上的所有操作都将被序列化。因此,如果您希望将set的读取/ wirte并行化,则lset可能不适合您。此外,lset中的存在检查实际上将读取完整记录并返回true false。 Aerospike对于普通键有一个exists api,它会根据内存索引返回true / false,这样会更快。

对于此用例,您可能无法将它们分隔为'设置'空中飞人。你需要100,000套。但截至目前,Aerospike仅支持1024套。

让我在你的清单中添加第三个选项。您可以为密钥本身建模,为您创建虚拟集,如下所示:

  • 如果您的实际密钥是key1并且您希望它转到set1,则可以将您的混搭密钥设置为set1_key1。
  • 当你想在set5中搜索key7的存在时,搜索set5_key7的存在

如果您使用此模型,您将利用Aerospike的数据分发,并将负载平衡发挥到极致。存在检查将是最快的,因为没有I / O.