在RocksDB中高效存储大列表结构,实现分页检索数据

Pin*_*ani 9 nosql embedded database-design in-memory-database memory-optimized-tables

描述:

RocksDB 是一个键值存储,因此我们可以简单地序列化对象列表并存储与键对应的值。如果列表中的数据足够小,这将是可以的。

但是如果列表很大并且大小不断增加,那么我们需要对数据进行分页。因此,在这种情况下,存储与单个键对应的整个序列化列表数据不是一个好主意;因为会存在性能问题,因为每次将新数据插入列表时,这个非常大的值也需要在读取期间读取和更新,当向用户显示列表时,将检索整个值,而只有一部分是用户需要。

例如:假设我们想将用户下的订单存储在 RocksDB 中。然后我们可以在 RockDB “u:1:li:o” 中以下列方式存储这个订单数据:Serialised([O1{}, O2{},....On{}])。但是如果用户下的订单数以千计,我们想以页面的形式检索订单(一次 10 或 20 条记录)。因此,在同一个键中存储数千个订单并从该键中检索整个数据然后提供所需的 10-20 条记录并不是一个好主意。此外,用户向同一键添加新订单将影响上述性能。

所以我正在努力设计模式以在 RocksDB 中有效地存储和检索如此大的列表。

如果您能就架构设计提出您的建议,那将会很棒且非常有帮助。

sky*_*yde 2

您需要将“大列表”拆分为“段 B 树”的一组节点,然后将每个节点存储为 RocksDB 记录。

每个节点都需要将其高度及其左子节点 ID 存储在“段 B 树”中。

这有很多好处

  1. 这将让您无需扫描整个列表即可查找列表中是否有一个条目。

  2. 扫描所有叶子节点会很快,因为叶子节点有连续的 ID

  3. 这使您可以使用偏移轻松获取列表的任何子集。

有关更多详细信息,请参阅:https://www.sqlite.org/fts3.html 。