LevelDB如何处理bloom filter中的sequence number?
How does LevelDB handle sequence number in bloom filter?
我已经阅读了LevelDB
的源代码。我发现它在调用 filter_block 的 AddKey()
时使用了内部密钥。如果我们稍后调用Get()
,它将使用最后一个序列号构造一个查找键,并将该键传递给函数KeyMayMatch()
。但是最后的序号和AddKey()
中使用的序号不一样,为什么布隆过滤器return能得到正确的结果呢?
在 RocksDB 中,要创建 bloom,您必须指定要添加到 bloom 的每个键的字节数。虽然Internal key是user key和sequenceNumber的组合,后者在创建filter时会被剥离。序列号将不是用于构建 bloom 的密钥的一部分。
因此,当您调用 Get()
时,给定的密钥将传递给 KeyMayMatch()
,如果布隆过滤器结果为真,那么 rocksdb 会扫描文件以获取密钥(如果它存在。记住布隆过滤器可能会产生误报).如果布隆结果为假,则密钥不存在于数据库中。
我已经阅读了LevelDB
的源代码。我发现它在调用 filter_block 的 AddKey()
时使用了内部密钥。如果我们稍后调用Get()
,它将使用最后一个序列号构造一个查找键,并将该键传递给函数KeyMayMatch()
。但是最后的序号和AddKey()
中使用的序号不一样,为什么布隆过滤器return能得到正确的结果呢?
在 RocksDB 中,要创建 bloom,您必须指定要添加到 bloom 的每个键的字节数。虽然Internal key是user key和sequenceNumber的组合,后者在创建filter时会被剥离。序列号将不是用于构建 bloom 的密钥的一部分。
因此,当您调用 Get()
时,给定的密钥将传递给 KeyMayMatch()
,如果布隆过滤器结果为真,那么 rocksdb 会扫描文件以获取密钥(如果它存在。记住布隆过滤器可能会产生误报).如果布隆结果为假,则密钥不存在于数据库中。