Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2020-12-15 rocksdb研究

2020-12-15 rocksdb研究

作者头像
oracle3
发布于 2022-04-22 09:54:09
发布于 2022-04-22 09:54:09
62600
代码可运行
举报
运行总次数:0
代码可运行

参考文章:gorocksdb 的安装与使用搭建环境,文章里描述的几个错误我都没有遇到,很顺利的完成了,因此列下来 1、开发环境 ubuntu18 2、下载 rocksdb 最新的发行版

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wget https://github.com/facebook/rocksdb/archive/v6.14.6.tar.gz
tar xvzf v6.14.6.tar.gz
cd rocksdb-6.14.6/
make shared_lib -j9
sudo make install

这里就一次性成功了,也没有修改代码 3、安装其他依赖 文档写要安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
zlib - a library for data compression.
bzip2 - a library for data compression.
lz4 - a library for extremely fast data compression.
snappy - a library for fast data compression.
zstandard - Fast real-time compression algorithm.

最后发现只有zlib ,bzip2 安装成功了,其他3个根本找不到安装包,也就算了 4、安装 gorocksdb 也没有那么复杂直接执行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 go get github.com/tecbot/gorocksdb

5、测试代码 原文的代码有个小错误,这里修正了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
    "github.com/tecbot/gorocksdb"
    "log"
)

func main() {
    opts := gorocksdb.NewDefaultOptions()
    opts.SetCreateIfMissing(true)
    opts.SetCompression(gorocksdb.NoCompression)
    opts.SetWriteBufferSize(671088640)
    db, err := gorocksdb.OpenDb(opts, "test")
    wopt := gorocksdb.NewDefaultWriteOptions()
    if err != nil {
        log.Printf("%v\n", err)
    }
    defer db.Close()
    db.Put(wopt, []byte("data"), []byte("value"))
}

然后编译执行,也很顺利

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go build example.go
./example

不过这个例子看不到执行结果 然后又抄了个rocksdb使用说明

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
"errors"
"github.com/tecbot/gorocksdb"
"log"
"strconv"
)

const (
DB_PATH = "gorocksdb"
)

func main() {
db, err := OpenDB()
if err != nil {
log.Println("fail to open db,", nil, db)
}

readOptions := gorocksdb.NewDefaultReadOptions()
readOptions.SetFillCache(true)

writeOptions := gorocksdb.NewDefaultWriteOptions()
writeOptions.SetSync(true)

for i := 0; i < 10; i++ {
keyStr := "test" + strconv.Itoa(i)
var key []byte = []byte(keyStr)
db.Put(writeOptions, key, key)
log.Println(i, keyStr)
slice, err2 := db.Get(readOptions, key)
if err2 != nil {
log.Println("get data exception:", key, err2)
continue
}
log.Println("get data:", slice.Size(), string(slice.Data()))
}

}

// opendb
func OpenDB() (*gorocksdb.DB, error) {
options := gorocksdb.NewDefaultOptions()
options.SetCreateIfMissing(true)

bloomFilter := gorocksdb.NewBloomFilter(10)

readOptions := gorocksdb.NewDefaultReadOptions()
readOptions.SetFillCache(false)

rateLimiter := gorocksdb.NewRateLimiter(10000000, 10000, 10)
options.SetRateLimiter(rateLimiter)
options.SetCreateIfMissing(true)
options.EnableStatistics()
options.SetWriteBufferSize(8 * 1024)
options.SetMaxWriteBufferNumber(3)
options.SetMaxBackgroundCompactions(10)
// options.SetCompression(gorocksdb.SnappyCompression)
// options.SetCompactionStyle(gorocksdb.UniversalCompactionStyle)

options.SetHashSkipListRep(2000000, 4, 4)

blockBasedTableOptions := gorocksdb.NewDefaultBlockBasedTableOptions()
blockBasedTableOptions.SetBlockCache(gorocksdb.NewLRUCache(64 * 1024))
blockBasedTableOptions.SetFilterPolicy(bloomFilter)
blockBasedTableOptions.SetBlockSizeDeviation(5)
blockBasedTableOptions.SetBlockRestartInterval(10)
blockBasedTableOptions.SetBlockCacheCompressed(gorocksdb.NewLRUCache(64 * 1024))
blockBasedTableOptions.SetCacheIndexAndFilterBlocks(true)
blockBasedTableOptions.SetIndexType(gorocksdb.KHashSearchIndexType)

options.SetBlockBasedTableFactory(blockBasedTableOptions)
//log.Println(bloomFilter, readOptions)
options.SetPrefixExtractor(gorocksdb.NewFixedPrefixTransform(3))

options.SetAllowConcurrentMemtableWrites(false)

db, err := gorocksdb.OpenDb(options, DB_PATH)

if err != nil {
log.Fatalln("OPEN DB error", db, err)
db.Close()
return nil, errors.New("fail to open db")
} else {
log.Println("OPEN DB success", db)
}
return db, nil
}

算是比较顺利,只是有个小错误

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go build example2.go
./example2

这个就有执行结果了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2020/12/15 16:58:25 OPEN DB success &{0x2073260 gorocksdb 0xc00005c040}
2020/12/15 16:58:25 0 test0
2020/12/15 16:58:25 get data: 5 test0
2020/12/15 16:58:25 1 test1
2020/12/15 16:58:25 get data: 5 test1
2020/12/15 16:58:25 2 test2
2020/12/15 16:58:25 get data: 5 test2
2020/12/15 16:58:25 3 test3
2020/12/15 16:58:25 get data: 5 test3
2020/12/15 16:58:25 4 test4
2020/12/15 16:58:25 get data: 5 test4
2020/12/15 16:58:25 5 test5
2020/12/15 16:58:25 get data: 5 test5
2020/12/15 16:58:25 6 test6
2020/12/15 16:58:25 get data: 5 test6
2020/12/15 16:58:25 7 test7
2020/12/15 16:58:25 get data: 5 test7
2020/12/15 16:58:25 8 test8
2020/12/15 16:58:25 get data: 5 test8
2020/12/15 16:58:25 9 test9
2020/12/15 16:58:25 get data: 5 test9
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020.12.15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Rocksdb 离线生成sst文件并在线加载
RocksDB是Facebook的一个实验项目,目的是希望能开发一套能在服务器压力下,真正发挥高速存储硬件(特别是Flash存储)性能的高效数据库系统。这是一个C++库,允许存储任意长度二进制kv数据。支持原子读写操作。
JadePeng
2024/01/07
4480
一个全新的 kv 存储引擎 — LotusDB
经历了大概 4 个月的打磨,LotusDB 的第一个 release 版本终于发布了,我看了下,有 200 多次 commit(接近 rosedb 一年多的 commit 次数了)。
roseduan
2022/04/18
8920
一个全新的 kv 存储引擎 — LotusDB
Rocksdb简介
RocksDB项目是起源于Facebook,是一款作为各种存储介质上的服务器工作负载的存储引擎,最初专注于快速存储(尤其是闪存存储)。它是一个 C++ 库,用于存储任意大小的字节流的键和值。它支持点查找和范围扫描,并提供不同类型的 ACID 保证。
thierryzhou
2022/11/19
11K0
LevelDB 代码撸起来!
LevelDB 的大致原理已经讲完了,本节我们要亲自使用 Java 语言第三方库 leveldbjni 来实践一下 LevelDB 的各种特性。这个库使用了 Java Native Interface 计数将 C++ 实现的 LevelDB 包装成了 Java 平台 的 API。其它语言同样也是采用了类似 JNI 的技术来包装的 LevelDB。
老钱
2019/01/23
2K0
LevelDB 代码撸起来!
leveldb iterator 的 Prev 究竟比 Next 差在哪?
leveldb 通过 iterator 提供了范围查找、有序遍历的功能,支持正向迭代(Next)和反向迭代(Prev)。
linjinhe
2020/02/18
1.6K0
在云函数中使用真正serverless的kv数据
上次在云函数里面整了一个嵌入式的SQL数据库以后爽的连云开发数据库都不想用了。不过有的时候还是需要用到kv存储,那能不能也serverless一把呢?level就是一个还不错的选择。打包一个层以后直接引用就可以了:
黄希彤
2022/04/27
1.1K0
leveldb介绍「建议收藏」
The leveldb library provides a persistent key value store. Keys and values are arbitrary byte arrays. The keys are ordered within the key value store according to a user-specified comparator function.
全栈程序员站长
2022/07/22
8820
leveldb之Options详解
leveldb中Options有什么作用? Options 定义了打开leveldb时候的行为包括了key的比较函数、整个数据库的读写读写方式、后台任务、全局的日志、Memtable的上限、数据库打开文件的最大个数、Cache初始化、block的大小、默认压缩方式、基于磁盘读的过滤等,Options 定义了整个数据库打开的参数的入口。 leveldb同时也定义了ReadOptions和WriteIOptions分别来定义leveldb读和写的参数控制 Options定义是什么?都有哪些Options选型?
用户4700054
2022/08/17
9500
LevelDB Put如何写入数据
LevelDB Put如何写入数据 leveldb插入数据步骤 用户输入的kv数据首先组装为wal log entry写入到wal log中 然后将kv数据从内存中的wal log entry解析为memtable中的数据 最后在插入到memtable中,完成此次数据的put操作 写入流程分析 DB::Put分析 Status DB::Put(const WriteOptions& opt, const Slice& key, const Slice& value) { WriteBatch batch
用户4700054
2022/08/17
7800
我为什么放弃Go语言?
👉腾小云导读 你在什么时候会产生“想要放弃用 Go 语言”的念头?也许是在用 Go 开发过程中,接连不断踩坑的时候。本文作者提炼和总结《100 Go Mistakes and How to Avoid Them》里的精华内容,并结合自身的工作经验,盘点了 Go 的常见典型错误,撰写了这篇超全避坑指南。让我们跟随文章,一起重拾用 Go 的信心~ 👉目录 1 注意 shadow 变量 2 慎用 init 函数 3 embed types 优缺点 4 Functional Options Pattern 传递参数
腾讯云开发者
2023/06/06
1.8K0
我为什么放弃Go语言?
基于RocksDB编写一个简单的SQL数据库|得物技术
数据库DBMS是当前互联网开发者最熟悉的基础设施之一,很多后端开发者的入门项目就是一个简单的基于MySQL的数据管理系统。笔者一直想自己编写一个简单的SQL数据库,正好最近正在学习RocksDB和Zig语言的内容,就想利用这个机会作为学习成果的检验,于是就有了这个小项目。
得物技术
2024/12/20
1540
基于RocksDB编写一个简单的SQL数据库|得物技术
uni-app 开发鸿蒙应用—uts实现媒体文件下载并保存到系统相册
uni-app 开发鸿蒙应用 | uni-app官网 (dcloud.net.cn)
超级小可爱
2024/11/26
2741
uni-app 开发鸿蒙应用—uts实现媒体文件下载并保存到系统相册
LevelDB Java&Go实践
最近学习出现了一个分叉:levelDB,前进的路上总有意外,经过短暂学习已经掌握了基本使用,并没有阻碍太长时间。
FunTester
2021/11/19
7360
go微服务系列之一
hey,好久没有发博客了,最近换了新东家有点忙(其实是忙着学习,不是工作,毕竟为了money放弃了较擅长的java投向了go),很多要学的;这是在新公司接触微服务框架(micro框架)后的总结,在未来,我将会较深入的研究go和微服务,之后也会陆陆续续的发布一些文章,如果想直接查阅源码或者通过demo学习的,可以访问ricoder_demo。
李海彬
2019/05/08
7910
go微服务系列之一
【深度知识】LevelDB从入门到原理详解
LevelDB是Google开源的持久化KV单机数据库,具有很高的随机写,顺序读/写性能,但是随机读的性能很一般,也就是说,LevelDB很适合应用在查询较少,而写很多的场景。LevelDB应用了LSM (Log Structured Merge) 策略,lsm_tree对索引变更进行延迟及批量处理,并通过一种类似于归并排序的方式高效地将更新迁移到磁盘,降低索引插入开销。
辉哥
2020/03/20
10.7K1
【深度知识】LevelDB从入门到原理详解
go微服务系列之三
在前两篇系列博文中,我已经实现了user-srv、web-srv、api-srv,在新的一篇博文中,我要讲解的是如何在项目中如何使用redis存储session。如果想直接查阅源码或者通过demo学习的,可以访问ricoder_demo。
李海彬
2019/05/08
7410
go微服务系列之三
Titan 的设计与实现
Titan 是由 PingCAP 研发的一个基于 RocksDB 的高性能单机 key-value 存储引擎,其主要设计灵感来源于 USENIX FAST 2016 上发表的一篇论文 WiscKey。WiscKey 提出了一种高度基于 SSD 优化的设计,利用 SSD 高效的随机读写性能,通过将 value 分离出 LSM-tree 的方法来达到降低写放大的目的。
PingCAP
2019/01/23
1.7K0
LotusDB 设计与实现—3 内存 memtable
顾名思义,memtable 是内存中维护的组件,在 LSM Tree 存储模型中,memtable 相当于一块内存 buffer,数据写入到 WAL 后,然后在 memtable 中更新。
roseduan
2022/04/18
4790
LotusDB 设计与实现—3 内存 memtable
一日一学_Go语言mgo(mongo场景应用)
注意: 上图已经告知我们mongo不支持事务,在开发项目应用时,想要保证数据的完整性请考虑关系型数据库(经典例子银行转账)。 mongo提供了许多原子操作,比如文档的保存,修改,删除等,都是原子操作。所谓原子操作就是要么这个文档保存到mongodb,要么没有保存到mongodb,不会出现查询到的文档不完整的情况。
李海彬
2019/01/08
1.5K0
golang如何使用原生RPC及微服务简述
1、对于公司间的系统调用, 如果性能要求在100ms以上的服务,基于XML的SOAP协议 是一个值得考虑的方案。
花落花相惜
2021/11/21
9090
相关推荐
Rocksdb 离线生成sst文件并在线加载
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验