c++ - RocksDB 是存储同质对象的好选择吗?

标签 c++ rocksdb

我正在寻找 C++ 中的嵌入式数据存储引擎。 RocksDB 是一个键值存储。

我的数据非常同质。我有一定数量的类型(大约 20 个),并且存储了这些类型的许多实例(大约 100 万个)。

我认为数据的同质性​​使得 RocksDB 成为一个糟糕的选择。如果我单独序列化每个对象,我肯定会复制架构元数据吗?这肯定会导致性能不佳吗?

所以我的问题是:RocksDB 是存储同类对象的好选择吗?如果是,如何避免复制模式元数据对性能的影响?

最佳答案

与 sqlite 等不同,RocksDB 中没有模式元数据,因为没有模式:它将二进制键映射到二进制值。 RocksDB 没有内置序列化。如果您要存储对象,则必须自己序列化它们并使用键、键前缀或列族(〜数据库表灯)等来区分类型。

通常您会使用 RocksDB 来构建某种自定义数据库。有人在其之上构建了一个 protobuf 对象的缓存(ProfaneDB)。我经常会说它太低级了,但是如果您不需要结构化数据和查询,它会工作得很好,速度非常快,并且通常使用起来很愉快(他们的代码是可读的,有时是最好的文档,因为您将处理数据库内部结构)。

我之前在一个小型玩具应用程序中使用过 varint key-prefix,它只需要一个字节开销,最多 127 种类型,但列族可能更适合产品应用程序。它们还具有恒定的开销,并且可以单独调整、添加、删除和管理。我不会为了几个字节而放弃从它们那里获得的附加功能。如果您使用 RocksDB,这也大致代表了您处理问题的级别。

关于c++ - RocksDB 是存储同质对象的好选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54002486/

相关文章:

apache-kafka - Apache Kafka 状态存储

c++ - 如何防止 URLDownloadToFile 从缓存中检索?

c++ - C++中的参数类

c++ - 参数化和 "function template partial specialization is not allowed"

c++ - 与使用迭代器相比,为什么 Get 和 MultiGet 对于大型键集要慢得多?

sqlite - 嵌入式键值数据库与每个键只存储一个文件?

c++ - memcpy 和单个数据字的赋值语句有什么区别?

c++ - 在 OMNeT++ 中使用多重继承时是否存在任何已知问题?

c++ - 析构函数必须对默认初始化的类成员才可用(公共(public))还是完全有效?

mysql - RocksDB 与 Cassandra