当前位置: 首页 > news >正文

rocksdb merge的简单记录

背景

rocksdb的merge主要是为了解决读&写需要两步的操作。例如定义一个累加器,总得先把之前的值读出来才能加。

下面给两个例子,大家可以直接用。

AboutAddMerge

#include <iostream>
#include <rocksdb/db.h>
#include <rocksdb/table.h>
#include <rocksdb/options.h>#include <rocksdb/filter_policy.h>#include <rocksdb/iostats_context.h>
#include <rocksdb/trace_reader_writer.h>
#include "utilities/merge_operators.h"
#include "util/coding.h"using namespace rocksdb;using namespace std;
rocksdb::DB* db;
rocksdb::Options option;void OpenDB() {option.create_if_missing = true;option.compression = rocksdb::CompressionType::kNoCompression;option.merge_operator =MergeOperators::CreateUInt64AddOperator();auto s = rocksdb::DB::Open(option, "./db", &db);if (!s.ok()) {cout << "open faled :  " << s.ToString() << endl;exit(-1);}cout << "Finish open !"<< endl;
}void DoWrite() {int j = 0;string key = std::to_string(j);std::string value;char buf[8];rocksdb::Status s;EncodeFixed64(buf, 15);db->Merge(rocksdb::WriteOptions(),key, std::string(buf,8));EncodeFixed64(buf, 33);s = db->Merge(rocksdb::WriteOptions(),key, std::string(buf,8));EncodeFixed64(buf, 77);s = db->Merge(rocksdb::WriteOptions(),key, std::string(buf,8));if (!s.ok()) {cout << "Merge value failed: " << s.ToString() << endl;exit(-1);}cout << "Finish merge !" << endl;s = db->Get(rocksdb::ReadOptions(), key, &value);if (!s.ok()) {cout << "Get after only merge is failed " << s.ToString() << endl;exit(-1);}cout << "Get merge value " << value.size() << " " << DecodeFixed64(value.data()) << endl;
}int main() {OpenDB();DoWrite();return 0;
}

最终打印结果

Get merge value 8 155

AboutAppendMerge

#include <rocksdb/db.h>
#include <rocksdb/iostats_context.h>
#include <rocksdb/options.h>
#include <rocksdb/table.h>
#include <rocksdb/trace_reader_writer.h>#include <iostream>#include "utilities/merge_operators.h"
using namespace rocksdb;rocksdb::DB* db;void OpenDB() {rocksdb::Options option;option.create_if_missing = true;// 默认会用 逗号分隔 不同的mergeoption.merge_operator = MergeOperators::CreateStringAppendOperator();auto s = rocksdb::DB::Open(option, "./db", &db);if (!s.ok()) {std::cout << "open faled :  " << s.ToString() << std::endl;exit(-1);}std::cout << "Finish open !" << std::endl;
}void DoWrite() {std::string key = "mykey5";std::string value;rocksdb::WriteOptions writeOptions;db->Merge(writeOptions, key, "1");db->Merge(writeOptions, key, "3");db->Merge(writeOptions, key, "    ");db->Merge(writeOptions, key, "abc");rocksdb::Status s = db->Merge(writeOptions, key, "6");if (!s.ok()) {std::cout << "Merge value failed: " << s.ToString() << std::endl;exit(-1);}s = db->Get(rocksdb::ReadOptions(), key, &value);if (!s.ok()) {std::cout << "Get after only merge is failed " << s.ToString() << std::endl;exit(-1);}std::cout << "Get merge value " << key << " " << value << std::endl;
}int main() {OpenDB();DoWrite();return 0;
}

最后打印结果

Get merge value mykey5 1,3,    ,abc,6

CMakeList.TXT

add_executable(AboutAppendMerge app/AboutAppendMerge.cpp)
target_link_libraries(AboutAppendMerge ${ROCKSDB_SHARED_LIB})add_executable(AboutAddMerge app/AboutAddMerge.cpp)
target_link_libraries(AboutAddMerge ${ROCKSDB_SHARED_LIB})

参考资料

https://blog.csdn.net/Z_Stand/article/details/119703176

http://www.lryc.cn/news/457315.html

相关文章:

  • 安卓开发板_MTK联发科评估套件_安卓开发板Demo板
  • maven指定模块快速打包idea插件Quick Maven Package
  • i春秋云境靶场之CVE-2022-26965
  • 流域生态系统服务评价、水文水生态分析、碳收支、气候变化影响、制图等领域中的应用
  • 超像素提取加svm训练,鼠标点击选择标签(左键为正样本,右键为负样本)
  • Vue 中引入 ECharts 的详细步骤与示例
  • 在 EC2 AWS 中开启防火墙后将自己锁定在 SSH 之外
  • OpenGL 进阶系列02 - OpenGL绘制三角形的必要步骤
  • MySql基础34题写题记录(11-20)
  • 设计模式——单例模式(1)
  • 剧本杀小程序:提升玩家游戏体验,带动经济效益
  • Linux系统通过编辑crontab来设置定时任务---定时关机
  • Mac电脑word文档误删,4个方法快速恢复
  • threejs-基础材质设置
  • 【大模型开发】AI提示词框架:解锁ICIO、CRISPE、BROKE和RASCEF的强大潜力
  • Rust学习如何更有信心?
  • 3个简单易懂的方法,教你马上掌握excel表格数据打印技巧
  • dbt 增量策略模型实战教程
  • 【含文档】基于Springboot+Android的校园论坛系统(含源码+数据库+lw)
  • Go版数据结构 -【8.4 快速排序】
  • 达梦DBLINK访问ORACLE配置方法
  • 基础知识1
  • 网页前端开发之Javascript入门篇(9/9):对象
  • Oracle RAC IPC Send timeout detected问题分析处理
  • QT 实现QMessageBox::about()信息自定义显示
  • (C++进阶)C++20
  • 【常用的安装破解版指令】MAC安装破解版软件显示文件损坏时
  • 【QT Quick】定时器和线程:定时器Timer
  • 【NIO基础】NIO(非阻塞 I/O)和 IO(传统 I/O)的区别,以及 NIO 的三大组件详解
  • HDLBits中文版,标准参考答案 | 3.1.3 Arithmetic Circuits | 算术电路