2

我正在调试我的代码,我发现这个设置名称为“null”的 Aerospike java 客户端代码可以正常工作并将数据插入到 aerospike 中:

AerospikeClient client = new AerospikeClient("localhost", 3000);
Key key = new Key("test", null, inputPayload.getUuid());//Note that the set name is given as "null"

Bin bin1 = new Bin("segments", inputPayload.getSegments());

client.put(null, key, bin1);

我能够插入和检索数据,但show sets没有透露任何集合名称。经过一些调试,我发现数据使用select * from <namespace>

在此处输入图像描述

我的问题是

  1. 如果数据没有存储在集合中,那么它存储在哪里?
  2. 我们知道 aerospike 与关系数据库相比:namespace == database 和 set == table。但是在关系型数据库中,我们是不允许直接往数据库中插入数据的,我们需要先创建一个表。这是有道理的。那么,为什么 aerospike 允许我们使用空集来做到这一点?
4

3 回答 3

4

在 Aerospike 中,您最多可以定义 1024 个集合,(0 到 1023)...默认集合 #0 是“空”集合。集合名称只是记录上的元数据 - 数据建模方便并有助于某些命令 - 特别是 5.6 版中发布的最新功能,集合索引 - 大大加快了扫描少量记录(比如 1,000)属于说, “setA”,在一个巨大的命名空间中(例如,10 亿条记录)。始终将集合元数据附加到记录还有其他操作优势,即为每个记录指定集合名称,例如在 Enterprise Edition 中使用持久截断。如果您在空集中和命名集中混合有记录,则不能仅截断空集中的记录. 如果您有一个专用的命名空间来存储您不想分配集合名称的类似记录,它可以节省您的存储空间 - 集合名称与设备存储中的每条记录一起存储。因此,在某些数据模型中存在不使用集合名称的动机。一个集合名称最多可以包含 63 个字符,每个字符在设备上占用一个字节的存储空间,每条记录。

于 2021-05-27T16:20:44.493 回答
3

好问题 :) 如果未指定集合,则记录将存储在您想出的“空”集合中。但是您可以通过将disallow-null-setname配置参数设置为 true来禁用此行为。

于 2021-05-27T15:37:17.370 回答
1

我们知道 aerospike 与关系数据库相比:

集合和表是相似的概念,但它们并不相同。Aerospike 的早期版本没有“集合”的概念,当时开发的许多应用程序现在更喜欢通过不发送集合名称来节省网络和存储开销。

disallow-null-setname = true对于您的应用程序,您可以通过添加到命名空间配置来禁止设置“null” 。

于 2021-05-27T15:42:29.753 回答