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

Gee*_*Jan 4 data-modeling redis aerospike

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

饥饿最多的结构之一是大约100.000个Redis集,每个集可以包含多达10,000个字符串.每个字符串介于10到30个字符之间.

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

对这些进行建模的最佳方法是什么?我通常会看到两个选项:*将redis设置为Aerospike lset *模型,将每个值分别设置为一组.

除了这个选择,100.000 Redis集用作键上的分区.出于本地化的原因,在Aerospike中进行类似的分区/命名空间可能是有意义的.但是,我很确定Aerospike中"命名空间"的概念并不用于这种关键分区.在Aerospike中执行此操作的正确方法(如果有的话),还是不需要?

小智 6

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

我将Redis设置为Aerospike"lset"(一对一).Aerospike应该处理给定"lset"中数据的数据位置.


sun*_*nil 5

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

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

对于这个用例,您可能无法将它们分隔为aerospike的"集合".你需要100,000套.但截至目前,Aerospike仅支持1024套.

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

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

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

  • 这不是一个禁止的密钥号码,因为aerospike可以支持最多2 ^ 160个密钥.Aerospike每个索引条目占用大约64个字节的内存.因此,仅对于索引的RAM要求大约是64GB,如果你放置3-4个节点也不会太糟糕.但这是假设最坏的情况,即100k*10k.如果它们实际上不那么重要,那么需求就会减少.<set> _ <key>对于空中加速器没有任何意义.对于aerospike来说,这是一个正常的关键.分片基于键.因此,一组的键不会在一起.除非你有不同的理由,否则你不应该以此为目标. (3认同)