Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用aerospike客户端进行查询的最佳方式是什么?_Java_Primary Key_Aerospike_Bins - Fatal编程技术网

Java 使用aerospike客户端进行查询的最佳方式是什么?

Java 使用aerospike客户端进行查询的最佳方式是什么?,java,primary-key,aerospike,bins,Java,Primary Key,Aerospike,Bins,我有一套(set1) 垃圾箱: bin1(PK=key1) bin2(PK=key1) bin3(主键=键2) bin4(主键=键2) 从以下两种方法查询aerospike客户端数据时,哪种方法更优化(在查询时间、cpu使用率、1个客户端调用与2个客户端调用的故障案例方面): 方法1:使用aeropsike客户端进行1个get调用,该客户端具有BIN=[bin1,bin2,bin3,bin4]和keys=[key1,key2] 方法2:拨打2个aerospike客户端获取电话。第一次调用将有BI

我有一套(set1)

垃圾箱:

bin1(PK=key1)

bin2(PK=key1)

bin3(主键=键2)

bin4(主键=键2)

从以下两种方法查询aerospike客户端数据时,哪种方法更优化(在查询时间、cpu使用率、1个客户端调用与2个客户端调用的故障案例方面):

方法1:使用aeropsike客户端进行1个get调用,该客户端具有BIN=[bin1,bin2,bin3,bin4]和keys=[key1,key2]

方法2:拨打2个aerospike客户端获取电话。第一次调用将有BIN=[bin1,bin2]和keys=[key1],第二次调用将有BIN=[bin3,bin4]和keys=[key2]


我发现方法2更干净,因为在方法1中,我们将尝试获取所有组合的记录(例如:以键2作为主键的bin1),这将是额外的计算,主键集可能很大。但是方法2的缺点是两个Aerospike客户端调用。

A.批量读取与多个单次读取

这是一种错误的选择。是的,您可以对[key1,key2](1)进行批处理调用,并且您不应该指定bin1、bin2、bin3、bin4,只需在不选择bin的情况下获取完整记录即可。或者可以进行两个独立的get()调用,一个用于key1,一个用于key2(2)

但是,没有理由需要先读取key1,等待结果,然后再读取key2。您可以在一个线程中使用同步get(key1)读取它们,在另一个线程中使用同步get(key2)读取它们。Java客户端可以处理多线程使用。或者,您可以异步获取(key1)和立即异步获取(key2)

当记录数至少小于集群中的节点数时,批读取(如(1)中的)不如单次读取有效。记录是均匀分布的,因此,如果您有一个4节点集群,并且您使用4个键发出批处理请求,那么最终将得到每个节点大约1条记录的并行子批处理。在这种情况下,与批处理读取相关的开销是不值得的。请参阅文档和知识库中的更多信息。专家应该回答你的问题

B.Aerospike数据库中记录的数量不会影响读取性能

您担心“主键集可能很大”。这对Aerospike来说根本不是问题。事实上,Aerospike最棒的一点是,从一个有100万条记录的数据库或一个有1万亿条记录的数据库中获取一条记录的计算成本几乎相同

每个记录在中都有一个64字节的元数据项。主索引均匀地分布在集群的节点上,因为它非常均匀。每个节点存储一个均匀的分区共享,在集群中每个命名空间的4096个逻辑分区中。分区表示为红黑二叉树()的集合,带有一个导致正确分支的哈希表

为了找到任何记录,客户机将其密钥散列成一个20字节的摘要。客户端使用12位摘要找到分区ID,在本地保存的分区映射中查找它,并找到正确的节点。读取记录现在是到正确节点的单跳。在该节点上,服务线程从网卡的一个通道接收调用,在正确的分区中查找它(同样,从摘要中查找分区ID是一个简单的O(1)操作)。它直接跳到正确的sprig(也是O(1)),然后对记录的元数据执行简单的O(n logn)二叉树查找。现在,服务线程通过单个读取IO准确地知道在存储器中的何处查找记录。我更详细地解释了这个读取流(尽管在版本4.7中,事务队列和线程被删除;服务线程完成了所有工作)

另一点是,在索引中查找记录元数据所花费的时间比从存储中获取记录所花费的时间要少几个数量级

因此,集群中记录的数量不会改变从任意大小的数据集中读取随机记录的速度


我写了一篇文章,展示了如何利用这一事实,以每秒数百万个事务的速度从PB级的数据存储中进行亚毫秒级的读取。

我不确定自己是否理解得足够,无法尝试回答。您可以在一个事务中进行批处理调用以获取多个不同的密钥,并且记录应仍然可以独立使用,而不会混淆BIN和密钥…什么是“最佳”?你是如何回答这个问题的?我们无法告诉任何人在工程环境中什么是“最好的”,除非他们对其进行足够详细的定义,并提供足够的相关细节,使每个人都能就估价达成一致。不幸的是,结果混乱地依赖于细节。即使可以做到这一点,这里的问题也太多了。你需要解释一下,你在哪里,为什么自己被困在评估中。这些问题太宽泛了。尽管如此,我们还是经常遇到常见问题。