我想使用rocksdb并想明确知道它是如何处理重复的。
文件说:
The entire database is stored in a set of sstfiles. When a memtable is full,
its content is written out to a file in Level-0 (L0). RocksDB removes
duplicate and overwritten keys in the memtable when it is flushed to a file in L0.
现在,在拥有多个数据库的环境的情况下,我找不到描述。 在这种情况下,密钥环境是唯一的,还是每个数据库都有其唯一的密钥?我无法找到整个环境的行为描述。
答案 0 :(得分:0)
简短回答你的问题:有一个称为压缩的后台进程,它会定期将几个sst文件合并到一个单独的有序运行中(这个有序运行可以表示为多个sst文件,但每个都有不相交的密钥-range。)在这个压缩过程中,它处理重复的键。
以下是您问题的详尽答案:
RocksDB是一个LSM数据库。当一个键值对被写入RocksDB时,RocksDB只是为它创建一个数据条目并将其附加到一个名为MemTable的内存缓冲区。
当MemTable变满时,RocksDB会对所有键进行排序并将它们作为单个sst文件刷新。随着我们不断编写更多数据,将会刷新更多sst文件,其中每个sst文件通常具有重叠的键范围。此时,假设我们有N个sst文件,并且有一个读取请求进来。然后此读取请求必须检查所有这些N sst文件以查看它是否包含所请求的密钥,因为每个sst文件可以具有重叠密钥 - 范围。因此,在没有任何进程重新组织这些sst文件的情况下,随着我们不断编写更多数据,读取将变得更慢。
重新组织这些sst文件的过程称为压缩,它本质上是一种多路合并排序,如输入多个sst文件并输出单个排序运行的操作。在压缩过程中,RocksDB将对这些输入sst文件中的所有键进行排序,合并可能的数据条目,并在找到匹配的删除条目时删除数据条目。