DeleteRange

DeleteRange是一个操作,用于替换以下模式:用户想要删除范围[start, end]中的键的范围:

  1. ...
  2. Slice start, end;
  3. // set start and end
  4. auto it = db->NewIterator(ReadOptions());
  5. for (it->Seek(start); cmp->Compare(it->key(), end) < 0; it->Next()) {
  6. db->Delete(WriteOptions(), it->key());
  7. }
  8. ...

此模式需要执行范围扫描,这将阻止它成为原子操作,并使其不适合任何性能敏感的写路径。 为了缓解这种情况,RocksDB提供了一个本机操作来执行这项任务:

  1. ...
  2. Slice start, end;
  3. // set start and end
  4. db->DeleteRange(WriteOptions(), start, end);
  5. ...

在引擎盖下,这创建了一个范围墓碑,表示为一个kv,这大大加快了写入性能。 与扫描和删除模式相比,range tombstone的读取性能更具竞争力。有关更详细的性能分析,请参阅DeleteRange博客文章。 ( https://rocksdb.org/blog/2018/11/21/delete-range.html )

有关实现细节,请参见此页。 ( https://github.com/facebook/rocksdb/wiki/DeleteRange-Implementation )