c++ - 由前缀 RocksDb 索引的反向迭代
问题描述
我目前正在为个人项目使用 RocksDB 数据库,我尝试以与我的数据库相反的顺序获取所有内容,该数据库由前缀索引。但是我无法为我的循环找到好的代码。我跌倒了,好像我错过了什么。这是我的代码:
//My iterator is already created with the rocksdb::ReadOptions()
rocksdb::Slice key{reinterpret_cast<const char *>(indexToFind), sizeof(indexToFind};
std::vector<int> ids;
it->SeekForPrev(key);
auto currentKey = it->key();
while(it->Valid() && it->key().starts_with(key)) {
/* Some custom treatment here */
it->SeekForPrev(it->key());
it->Prev();
currentKey = it->key();
}
if (!it->status().ok()) {
std::cout << it->status().ToString() << std::endl;
}
assert(it->status().ok()); // Check for any errors found during the scan
提前干杯和感谢,克莱门特。
解决方案
我不认为本机rocksdb支持使用前缀的反向迭代。您可以从他们的 wiki 中很好地找到 Prefix Seek API。以下是来自wiki的PrefixSeekAPI的限制,
前缀迭代不支持 SeekToLast()。SeekToFirst() 仅受某些配置支持。如果您要针对迭代器执行这些类型的查询,则应该使用总订单模式。
使用前缀迭代的一个常见错误是使用前缀模式以相反的顺序进行迭代。但目前还不支持。如果反向迭代是您常见的查询模式,您可以重新排序数据以将您的迭代顺序变为正向。您可以通过实现自定义比较器来实现,或者以不同的方式对密钥进行编码。
请参阅此处的 wiki
推荐阅读
- python - 为什么 Python 的 Event.wait() 会被某些系统上的信号打断,而其他系统上却不能?
- python - 为除数创建工具
- angular - Angular 6 / Rxjs - 如何基础:observables 成功,错误,最后
- javascript - 我们可以通过本地服务器将 chrome 应用程序代码简单地作为 Web 应用程序运行吗?
- python-3.x - 指示行的日期时间是否在日期范围内
- java - Spring Boot 从异常处理程序返回 401 状态自定义对象
- sql - 将 From 语句添加到 Join 语句
- ruby-on-rails - 如何使用 ps_search gem for Rails 5 仅搜索已批准的帖子
- requirejs - 如何从我使用 require.js 的文件中调用对象
- android - 如何使用 onBackPressed() 在 Fragment 上显示 AlertDialog?