rocksdb列族笔记

1、简介

列族(Column Families)是rocksdb3.0提出的一个机制,用于对同一个数据库的记录(键值对)进行逻辑划分。默认情况下所有的记录
都会存储在一个默认列族里(ROCKSDB_NAMESPACE::kDefaultColumnFamilyName)
列族具有的属性
1)可以跨列族进行原子写,弥补了rocksdb在单个进程内只能操作一个数据库的问题。
2)在不同的列族,提供数据库的一致性视图
3)可以对列族进行独立配置
4)动态添加和drop列族

2、使用

Options, ColumnFamilyOptions, DBOptions
ColumnFamilyOptions用于配置列族,DBOptions用于数据库粒度的配置,Options继承了ColumnFamilyOptions, DBOptions,
因此Options可以执行上述两种配置。

每个列族通过句柄类ColumnFamilyHandle进行操作,包括列族的创建和销毁都要使用ColumnFamilyHandle完成。
创建列族,
下列代码就创建了一个名为”new_cf”的列族

ColumnFamilyHandle *handl;
db->CreateColumnFamily(ColumnFamilyOptions(), "new_cf", &handl);
db->DestroyColumnFamilyHandle(handl);

使用列族,
基于列族打开数据库,和常规的方式不同。具体来说,如果我们以读写模式打开数据库,则必须要给open传入所有的列族,
否则open方法会返回Status::InvalidArgument()。每个列族通过ColumnFamilyDescriptor表示,这个类包含了
{列族名,ColumnFamilyOptions}。下列代码通过读写模式打开了一个包含所有列族的数据库:

vector colume_families;
colume_families.push_back(ColumnFamilyDescriptor(ROCKSDB_NAMESPACE::kDefaultColumnFamilyName, ColumnFamilyOptions()));
colume_families.push_back(ColumnFamilyDescriptor("new_cf"), ColumnFamilyOptions())
vector cf_handles;
Status s = db->open(DBOptions(), DB_PATH, colume_families, &cf_handles, &db);

如果使用只读模式打开数据库,那么可以只传入我们需要读取的列族,不过默认的列族是必须要传入给open函数的

// open db read only
column_families.push_back(ColumnFamilyDescriptor("new_cf", ColumnFamilyOptions()));
column_families.push_back(ColumnFamilyDescriptor(kDefaultColumnFamilyName, ColumnFamilyOptions()));
s = DB::OpenForReadOnly(DBOptions(), kDBPath, column_families, &handles, &db);
assert(s.ok());
s = db->Get(ReadOptions(), handles[0], Slice("key2"), &value1);
assert(s.ok());

通过WriteBatch我们可以原子的操作不同的列族,例如可以通过handles[0]去删除handles[1]插入的键值对{“key”: “value”}

  // put and get from non-default column family
  s = db->Put(WriteOptions(), handles[1], Slice("key"), Slice("value"));
  assert(s.ok());
  std::string value;
  s = db->Get(ReadOptions(), handles[1], Slice("key"), &value);
  assert(s.ok());

  // atomic write
  WriteBatch batch;
  batch.Put(handles[0], Slice("key2"), Slice("value2"));
  batch.Put(handles[1], Slice("key3"), Slice("value3"));
  batch.Delete(handles[0], Slice("key"));
  s = db->Write(WriteOptions(), &batch);
  assert(s.ok());

3、原理和实现

简单的说,不同的列族是共享WAL的,但是memtable和SST file是隔离的。

Original: https://www.cnblogs.com/dennis-wong/p/16027863.html
Author: 成蹊0xc000
Title: rocksdb列族笔记

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582768/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • [ Shell ] 通过 Shell 脚本导出 GDSII/OASIS 文件

    常见的集成电路版图数据库文件格式有 GDSII 和 OASIS,virtuoso 提供了下面两个工具,可以用来通过命令行导出版图数据。 strmout (导出为 GDSII 格式)…

    Linux 2023年6月7日
    0131
  • 进程

    理论知识 操作系统背景知识 顾名思义,进程即正在执行的一个过程。进程是对正在运行程序的一个抽象。 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重…

    Linux 2023年6月14日
    097
  • Linux之Nginx入门

    一、Nginx介绍 Nginx是一个开源且高性能、可靠的http web服务、代理服务。 开源:直接获取源代码 高性能:支持海量并发 可靠:服务稳定 高性能,高并发 Nginx支持…

    Linux 2023年5月27日
    0105
  • Ubuntu修改静态IP

    转载自:https://www.cnblogs.com/xwgcxk/p/10560181.html 第一步:先获取网卡名称,输入ifconfig,如下图,我们的网卡名称为 ens…

    Linux 2023年6月8日
    081
  • Quartus II 13.0 sp1的官方下载页面

    今天为了下个ModelSim跑到网上去找下载资源,清一色的百度网盘,下载速度60k/s,简直有病,于是跑到Intel官网上把连接挖出来了,供各位直接下载 实测使用IDM多线程下载速…

    Linux 2023年6月13日
    0178
  • RabbitMQ知识简单理解

    官网链接:http://next.rabbitmq.com/getstarted.html 官网给出了每种工作模式的实例代码,可以参考其中的实现 一、RabbitMQ整体架构图 二…

    Linux 2023年6月14日
    0118
  • 趣谈IO多路复用的本质

    在《轻松搞懂5种IO模型》中,我发起了一个投票。 答案是【同步IO多路复用】。目前,60%的朋友答对了。原因这里解释一下。 同步和异步的概念区别 同步:线程自己获取结果。(一条线索…

    Linux 2023年5月27日
    076
  • webshell查杀的方法

    从您反馈的情况看,是您的网站被植入了webshel后门文件导致的。您可以先对当前的服务器做下快照备份,然后将您的网站代码拷贝到本地进行下webshell查杀:https://www…

    Linux 2023年5月28日
    0118
  • Spring事务基础入门及AOP陷阱分析

    更新说明: 2021-12-28 6.2.1 章节更新了代理说明图,调整了说明顺序,修复了错误说明 转载请注明出处: https://www.cnblogs.com/qnlcy/p…

    Linux 2023年6月6日
    084
  • Kubernetes&Docker集群部署

    集群环境搭建 搭建kubernetes的集群环境 环境规划 集群类型 kubernetes集群大体上分为两类: 一主多从和 多主多从。 一主多从:一台Master节点和多台Node…

    Linux 2023年6月13日
    084
  • 删除数据库表中重复数据的方法

    一直使用Postgresql数据库,有一张表是这样的: DROP TABLE IF EXISTS "public"."devicedata"…

    Linux 2023年6月6日
    0101
  • Centos7(非LVM)扩容根目录

    Centos7(非LVM)扩容根目录 系统安装在了VM上,so首先对虚拟机进行扩容: 1、进入VM,选择”虚拟机——>设置” 2、选择硬盘,看到扩展为…

    Linux 2023年6月8日
    0153
  • 字节 字符 位(比特)

    位(bit):binary digit,计算机储存的最小单位,n个比特可以确定2^n个情况,如11010100为8位。 字节(byte):一个字节储存8位无符号数,范围为0-225…

    Linux 2023年6月13日
    0107
  • Nginx基础入门篇(3)—返回状态码详解

    一般常见返回状态码 200 – 服务器成功返&a…

    Linux 2023年6月6日
    0102
  • Guava中的封装的Map操作

    引入依赖 <dependency> <groupId>com.google.guavagroupId> <artifactId>guava…

    Linux 2023年6月7日
    0116
  • ASP.NET Core 2.2 : 二十三. 深入聊一聊配置的内部处理机制

    上一章介绍了配置的多种数据源被注册、加载和获取的过程,本节看一下这个过程系统是如何实现的。(ASP.NET Core 系列目录) 一、数据源的注册 在上一节介绍的数据源设置中,ap…

    Linux 2023年6月7日
    0146
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球