单一删除

它会删除key的最新版本,而旧版本的密钥是否会恢复生命则没有定义

基本用法

SingleDelete是一个新的数据库操作。与传统的Delete()操作不同,当两个值在压缩中对齐时,删除项和值一起被删除。 因此,与Delete()方法类似,SingleDelete()删除键的数据库条目,但前提条件是键存在且没有被覆盖。 成功时返回OK,错误时返回非OK状态。如果密钥在数据库中不存在,则不是错误。如果一个键被覆盖(通过多次调用Put()),那么在这个键上调用SingleDelete()的结果是未定义的。 SingleDelete()只有在此键自上次调用SingleDelete()以来只有一个Put()时才正确。该特性目前是针对特定工作负载的实验性性能优化。下面的代码展示了如何使用SingleDelete:

  1. std::string value;
  2. rocksdb::Status s;
  3. db->Put(rocksdb::WriteOptions(), "foo", "bar1");
  4. db->SingleDelete(rocksdb::WriteOptions(), "foo");
  5. s = db->Get(rocksdb::ReadOptions(), "foo", &value); // s.IsNotFound()==true
  6. db->Put(rocksdb::WriteOptions(), "foo", "bar2");
  7. db->Put(rocksdb::WriteOptions(), "foo", "bar3");
  8. db->SingleDelete(rocksdb::ReadOptions(), "foo", &value); // Undefined result

在WriteBatch中也可以使用SingleDelete API。实际上,DB::SingleDelete()是通过在这个批处理中只创建一个操作SingleDelete的WriteBatch来实现的。 下面的代码片段展示了WriteBatch::SingleDelete()的基本用法:

  1. rocksdb::WriteBatch batch;
  2. batch.Put(key1, value);
  3. batch.SingleDelete(key1);
  4. s = db->Write(rocksdb::WriteOptions(), &batch);

说明

  • 调用者必须确保SingleDelete只适用于没有使用Delete()删除或使用Merge()编写的键。 将SingleDelete()操作与Delete()和Merge()混合使用可能会导致未定义的行为(其他键不受此影响)
  • SingleDelete与cuckoo散列表不兼容,这意味着如果设置了选项,就不应该调用SingleDelete。 与NewHashCuckooRepFactory memtable_factory
  • 目前不允许连续的单次删除
  • 考虑设置write_options.sync = true(异步写入)