微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

即使“设置”名称为空,Aerospike java 客户端也会存储数据

如何解决即使“设置”名称为空,Aerospike java 客户端也会存储数据

我正在调试我的代码,我发现这个设置名称为“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>

找到了数据

enter image description here

我的问题是

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

解决方法

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

,

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

,

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。