这个功能会删除一个 key 的最后一个版本的值,但是旧的版本的值会不会重新出现,不确定
基本使用¶
SingleDelete 是一个新的数据库操作。与传统的 Delete 操作不同,被删除的项,会在压缩的时候与数值一起被移除。因此,与 Delete 类似,SingleDelete 删除一个 key,但是有一个前提,就是这个 key 存在且没有被覆盖过。成功返回 OK,否则返回非 OK。如果 key 不存在,不会报错。如果 key 被覆盖过(多次调用 Put),那么对一个 key 调用 SingleDelete 会导致未定义行为。只有当一个 key 在上次调用过 SingleDelete 之后只被 Put 过一次,SingleDelete 才能正确执行。这个功能目前还是为了处理某些非常特别的工作的实验性质的。下面一段代码展示了如何使用 SingleDelete:
std::string value;
rocksdb::Status s;
db->Put(rocksdb::WriteOptions(), "foo", "bar1");
db->SingleDelete(rocksdb::WriteOptions(), "foo");
s = db->Get(rocksdb::ReadOptions(), "foo", &value); // s.IsNotFound()==true
db->Put(rocksdb::WriteOptions(), "foo", "bar2");
db->Put(rocksdb::WriteOptions(), "foo", "bar3");
db->SingleDelete(rocksdb::ReadOptions(), "foo", &value); // Undefined result
SingleDelete API is also available in WriteBatch. Actually, DB::SingleDelete() is implemented by creating a WriteBatch with only one operation, SingleDelete, in this batch. The following code snippet shows the basic usage of WriteBatch::SingleDelete():
rocksdb::WriteBatch batch;
batch.Put(key1, value);
batch.SingleDelete(key1);
s = db->Write(rocksdb::WriteOptions(), &batch);
注意¶
- 调用者必须却表 SingleDelete 只用在那些没有被 Delete 删除,或者使用 Merge 写入过的 key。混合使用 SingleDelete,Delete 和 Merge 会导致未定义行为(其他的 key 不会受影响)。
- SingleDelete 与 cuckoo 哈希表不兼容,如果你把 options.memtable_factory 设置为 NewHashCuckooRepFactory,那么你就无法使用 SingleDelete
- 不允许连续的 SingleDelete
- 考虑设置 write_options.sync 为 true