【发布时间】:2020-01-18 16:23:19
【问题描述】:
我正在查看有关如何实现 SSTable 的说明。
这意味着您可以跳转到手提包的偏移并从那里扫描 直到你找到手工(或者没有,如果钥匙不在 文件)。
我不明白突出显示的部分。如果我们只知道给定键的偏移量,我们如何扫描直到找到所需的键?当我们在键后面滑动字节时,我们如何知道我们是否已经输入了一个新键,或者我们正在查看一个非常大的值?
【问题讨论】:
我正在查看有关如何实现 SSTable 的说明。
这意味着您可以跳转到手提包的偏移并从那里扫描 直到你找到手工(或者没有,如果钥匙不在 文件)。
我不明白突出显示的部分。如果我们只知道给定键的偏移量,我们如何扫描直到找到所需的键?当我们在键后面滑动字节时,我们如何知道我们是否已经输入了一个新键,或者我们正在查看一个非常大的值?
【问题讨论】:
Scylla 描述了一种实现in their docs。 (我与 Scylla 没有任何联系。我只是碰巧有这个。)他们将索引条目的密钥长度(不完全是您要查找的内容)存储在 index_entry 结构中。
struct index_file {
struct index_entry entries[];
};
struct index_entry {
be16 key_length;
char key[key_length];
varint position; // decoded into a 64-bit integer
varint promoted_index_length; // decoded into a 32-bit integer
byte promoted_index[promoted_index_length];
};
如果您的实现支持不同长度的密钥(我认为所有商业级 SSTable 实现都这样做),那么存储它们的长度是很常见的。通常,存储不同长度“事物”的软件使用包含“事物”长度的数据结构。 (Scylla 可能使用 Java 迭代器。)
【讨论】: