我正在调试我的代码,我发现这个设置名称为“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>
找到了数据
我的问题是
- 如果数据没有存储在集合中,那么它存储在哪里?
- 我们知道 aerospike 与关系数据库的比较是:namespace == database 和 set == table。但是在关系型数据库中,我们是不允许直接往db中插入数据的,需要先建表。这是有道理的。那么,为什么 aerospike 允许我们使用空集来做到这一点?
最佳答案
在 Aerospike 中,您最多可以定义 1024 个集合,(0 到 1023)...默认集合 #0 是“空”集合。集合名称只是记录上的元数据——数据建模的便利性,有助于某些命令——尤其是 5.6 版中发布的最新功能,集合索引——大大加快了扫描少量记录(比如 1,000 条)的速度,例如, “setA”,在一个原本巨大的命名空间(比如 10 亿条记录)中。始终将集合元数据附加到您的记录还有其他操作优势,即为每个记录指定一个集合名称,例如在企业版中使用持久截断。如果空集和命名集中的记录混合存在,则不能截断仅空集中的记录。如果您有一个专门的命名空间用于您不想分配集合名称的记录,它可以节省您的存储空间——集合名称与设备存储中的每条记录一起存储。因此,在某些数据模型中存在不使用集合名称的动机。集合名称最多可包含 63 个字符,每个字符在每条记录中占用设备一个字节的存储空间。
关于java - 即使 "set"名称为空,Aerospike Java 客户端也会存储数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67725063/