即使 "set" 名称为空,Aerospike java 客户端也会存储数据

Aerospike java client stores data even when the "set" name is null

我正在调试我的代码,我发现这个 Aerospike java 将名称设置为“null”的客户端代码可以工作并在 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。但是在关系型数据库中,我们是不允许直接往db中插入数据的,我们需要先创建一个table。这是有道理的。那么,为什么 aerospike 允许我们使用空集来做到这一点?

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

We know that aerospike compares to relational database as:

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

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

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