4

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

最占用内存的结构之一是大约 100.000 个 Redis 集,每个集最多可包含 10.000 个字符串。每个字符串的长度在 10 到 30 个字符之间。

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

对这些进行建模的最佳方法是什么?我通常会看到 2 个选项: * 将 redis 集建模为Aerospike lset * 分别对集合中的每个值进行建模。

除了这个选择,100.000 个 Redis 集被用作键的分区。由于局部性的原因,在 Aerospike 中使用类似的分区/命名空间可能是有意义的。但是,我很确定 Aerospike 中的“命名空间”概念并没有用于这种键分区。在 Aerospike 中执行此操作的正确方法(如果有)是什么,或者不需要?

4

2 回答 2

6

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

我会将 Redis 集映射到 Aerospike“lset”(一对一)。Aerospike 应该注意给定“lset”中数据的数据局部性。

于 2014-10-28T11:48:07.007 回答
5

是的,你不应该担心数据的位置,因为 Aerospike 会自动分片。这确保了集群中所有节点的数据分布和读/写负载的均衡。

放入 lset 有它的优点。它提供了类似于 redis 的功能,您无需编写自己的功能。但同时它也有它的缺点。因此,您应该根据自己的要求进行选择。单个集合上的所有操作都将被序列化。因此,如果您期望对集合的读/写是并行的,那么 lset 可能不适合您。此外,lset 中的存在检查实际上将读取完整记录并返回真假。Aerospike 有一个用于普通键的存在 api,它将根据内存中的索引返回真/假,这要快得多。

对于这个用例,您可能无法将它们分成 aerospike 的“集合”。你需要 100,000 套。但截至目前,Aerospike 只支持 1024 套。

让我在您的列表中添加第三个选项。您可以对密钥本身进行建模,以便为您创建虚拟集,如下所示:

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

如果您使用此模型,您将充分利用 Aerospike 的数据分布和负载平衡。存在检查将是最快的,因为没有 I/O。

于 2014-10-29T13:32:57.667 回答