SeekForPrev

SeekForPrev API

从4.13开始,Rocksdb添加了Iterator::SeekForPrev()。 与seek()相反,这个新API将查找小于或等于目标键的最后一个键。

  1. // Suppose we have keys "a1", "a3", "b1", "b2", "c2", "c4".
  2. auto iter = db->NewIterator(ReadOptions());
  3. iter->Seek("a1"); // iter->Key() == "a1";
  4. iter->Seek("a3"); // iter->Key() == "a3";
  5. iter->SeekForPrev("c4"); // iter->Key() == "c4";
  6. iter->SeekForPrev("c3"); // iter->Key() == "c2";

基本上,SeekForPrev()的行为类似于下面的代码片段:

  1. Seek(target);
  2. if (!Valid()) {
  3. SeekToLast();
  4. } else if (key() > target) {
  5. Prev();
  6. }

事实上,这个API提供的功能比这个代码片段更多。一个典型的例子是,假设我们有键”a1”、”a3”、”a5”、”b1”,并启用以第一个字节为前缀的prefix_extractor。 如果我们想让最后一个键小于等于a6。上面没有SeekForPrev()的代码不起作用。因为在Seek(“a6”)和Prev()之后,迭代器将进入无效状态。 但是现在,您需要的只是一个电话,查找”a6”并得到”a5”。

此外,SeekForPrev() API在内部支持前缀模式下的Prev()。现在,Next()和Prev()都可以混合在前缀模式中。由于SeekForPrev()!